Как передать фрагмент в качестве входных данных с переменным числом аргументов?

86

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

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

    import "os/exec"
    import "strings"
    func main(){
        plainCommand  := "echo hello world"
        sliceA := strings.Fields(plainCommand)
        cmd := exec.Command(sliceA)
    }
Пользователь без шляпы
источник

Ответы:

101

Спецификация языка программирования Go

Передача аргументов в ... параметры

Если f является вариативным с типом конечного параметра ... T, то внутри функции аргумент эквивалентен параметру типа [] T. При каждом вызове f аргумент, передаваемый в последний параметр, представляет собой новый фрагмент типа [] T, последовательные элементы которого являются фактическими аргументами, которые все должны быть присвоены типу T. Таким образом, длина фрагмента равна количеству аргументы привязаны к последнему параметру и могут отличаться для каждого сайта вызова.


Пакет exec

команда func

func Command(name string, arg ...string) *Cmd

Команда возвращает структуру Cmd для выполнения указанной программы с заданными аргументами.

Возвращаемое поле Cmd Args состоит из имени команды, за которым следуют элементы 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
Питер
источник
10

Список аргументов команды можно получить из функции пакета flagArgs() . Затем вы можете передать это функции, используя стиль ввода с переменным числом аргументов ( 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 .

Детская площадка

Интермернет
источник
5

команда 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:]...)
}
Натенапс
источник