Как передать фрагмент в виде вариационного ввода?
У меня есть функция func more(... t)
. Мне интересно, можно ли использовать срез для заполнения списка аргументов ...
.
Я пытаюсь решить следующую программу. В основном, чтобы имитировать нормальную оболочку, которая получает команду в виде строки.
Command функция требует "списка" аргументов, и я не вижу, как я могу преобразовать строку в такой список
import "os/exec"
import "strings"
func main(){
plainCommand := "echo hello world"
sliceA := strings.Fields(plainCommand)
cmd := exec.Command(sliceA)
}
Ответы
Ответ 1
Спецификация языка программирования Go
Передача аргументов в... параметры
Если f является вариационным с конечным типом параметра... T, то в пределах function аргумент эквивалентен параметру типа [] T. В каждый вызов f, аргумент, переданный окончательному параметру, является новым срез типа [] T, последовательные элементы которого являются фактическими аргументами, которые все должны быть отнесены к типу T. Длина среза равна поэтому количество аргументов, связанных с конечным параметром, и может отличаются для каждого сайта вызова.
Исполнение пакета
команда func
func Command(name string, arg ...string) *Cmd
Команда возвращает структуру Cmd для выполнения именованной программы с помощью заданные аргументы.
Возвращенное поле Cmd Args построено из имени команды за которыми следуют элементы arg, поэтому arg не должен включать команду само название. Например, Command ( "echo", "hello" )
Например,
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
Ответ 2
Список аргументов команды можно получить из пакета флагов 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.
Игровая площадка
Ответ 3
команда 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:]...)
}