Как передать fragment в виде вариационного ввода?
У меня есть функция func more(... t)
. Мне интересно, можно ли использовать срез для заполнения списка аргументов ...
Я пытаюсь решить следующую программу. В основном, чтобы имитировать нормальную оболочку, которая получает команду в виде строки. Командная функция требует «списка» аргументов, и я не вижу, как я могу преобразовать строку в такой список
import "os/exec" import "strings" func main(){ plainCommand := "echo hello world" sliceA := strings.Fields(plainCommand) cmd := exec.Command(sliceA) }
- Невозможно преобразовать строку в интерфейс {}
- Предоставляет ли RE REPL?
- Что это за "foo. (Bar.Baz)" вещь в коде Go?
- Инициализировать вложенную структуру в Голанге
- Go 1.3 Сборщик мусора, не отбрасывающий серверную память обратно в систему
- В чем смысл интерфейса {}?
- как слушать N каналов? (оператор динамического выбора)
- Настройка заголовков HTTP
- Является ли это идиоматическим пулом рабочих streamов в Go?
- Это кастинг в голанге?
- Как сбросить gotoutine stacktraces?
- Ошибка «Неизвестная escape-последовательность» в Go
- Unmarshal JSON с неизвестными полями
Спецификация языка программирования Go
Передача аргументов параметрам …
Если f является вариационным с конечным типом параметра … T, то внутри функции аргумент эквивалентен параметру типа [] T. При каждом вызове f аргумент, передаваемый окончательному параметру, представляет собой новый срез типа [] T, последовательные элементы которого являются фактическими аргументами, которые все должны быть назначены типу T. Следовательно, длина среза равна числу аргументы, связанные с конечным параметром, и могут различаться для каждого сайта вызова.
Исполнение пакета
команда func
func Command(name string, arg ...string) *Cmd
Команда возвращает структуру Cmd для выполнения именованной программы с заданными аргументами.
Возвращаемое поле Args Cmd построено из имени команды, за которым следуют элементы arg, поэтому arg не должен включать имя самой команды. Например, Command («эхо», «привет»)
Например,
package main import ( "fmt" "os/exec" ) func main() { name := "echo" args := []string{"hello", "world"} cmd := exec.Command(name, args...) out, err := cmd.Output() if err != nil { fmt.Println(err) } fmt.Println(string(out)) }
Вывод:
hello world
Список аргументов команды можно получить из функции Args()
пакета флагов . Затем вы можете передать это функции с использованием стиля входного ввода ( func(input...)
)
Из спецификации :
Если f является вариационным с конечным типом параметра … T, то внутри функции аргумент эквивалентен параметру типа [] T. При каждом вызове f аргумент, передаваемый окончательному параметру, представляет собой новый срез типа [] T, последовательные элементы которого являются фактическими аргументами, которые все должны быть назначены типу T.
Пример:
package main import "fmt" func echo(strings ...string) { for _, s := range strings { fmt.Println(s) } } func main() { strings := []string{"a", "b", "c"} echo(strings...) // Treat input to function as variadic }
Дополнительную информацию см. В описании Go Go .
Детская площадка
команда func
func Command(name string, arg ...string) *Cmd
Команда возвращает структуру Cmd для выполнения именованной программы с заданными аргументами.
Поэтому вам нужно извлечь команду, которая находится в sliceA[0]
а затем передать все аргументы с помощью переменной, но удалив команду sliceA[1:]...
import "os/exec" import "strings" func main(){ plainCommand := "echo hello world" sliceA := strings.Fields(plainCommand) cmd := exec.Command(sliceA[0], sliceA[1:]...) }