Подтвердить что ты не робот

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

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

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

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

Ответ 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:]...)
}