Как передать fragment в виде вариационного ввода?

У меня есть функция func more(... t) . Мне интересно, можно ли использовать срез для заполнения списка аргументов ...

Я пытаюсь решить следующую программу. В основном, чтобы имитировать нормальную оболочку, которая получает команду в виде строки. Командная функция требует «списка» аргументов, и я не вижу, как я могу преобразовать строку в такой список

  import "os/exec" import "strings" func main(){ plainCommand := "echo hello world" sliceA := strings.Fields(plainCommand) cmd := exec.Command(sliceA) } 

Спецификация языка программирования 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:]...) } 
  • В частности, проверьте ошибку тайм-аута
  • Что именно делает runtime.Gosched делать?
  • Приемник значений против приемника указателя в Голанге?
  • golang: slice struct! = срез интерфейса, который он реализует?
  • Изменение значений во время итерации в golang
  • Как работает компилятор Go1?
  • Циклические зависимости и интерфейсы в Голанге
  • Зачем мне делать () или new ()?
  • Организация проекта с несколькими файлами Go
  • Доступ к структуре на карте (без копирования)
  • Почему я могу вводить функции псевдонима и использовать их без кастинга?
  • Interesting Posts
    Давайте будем гением компьютера.