Jak przekazać wycinek jako zmienną wejściową?

86

Mam funkcję func more(... t). Zastanawiam się, czy możliwe jest użycie wycinka do wypełnienia listy argumentów ....

Próbuję rozwiązać następujący program. Zasadniczo, aby naśladować normalną powłokę, która otrzymuje polecenie jako ciąg. Funkcja polecenia wymaga „listy” argumentów i nie wiem, jak mogę zamienić ciąg znaków na taką listę

    import "os/exec"
    import "strings"
    func main(){
        plainCommand  := "echo hello world"
        sliceA := strings.Fields(plainCommand)
        cmd := exec.Command(sliceA)
    }
Użytkownik bez kapelusza
źródło

Odpowiedzi:

101

Specyfikacja języka programowania Go

Przekazywanie argumentów do ... parametrów

Jeśli f jest wariadyczne z końcowym typem parametru ... T, to w funkcji argument jest równoważny parametrowi typu [] T. Przy każdym wywołaniu funkcji f argumentem przekazanym do końcowego parametru jest nowy wycinek typu [] T, którego kolejne elementy są faktycznymi argumentami, z których wszystkie muszą być przypisane do typu T. Długość wycinka jest zatem liczbą argumenty powiązane z końcowym parametrem i mogą się różnić dla każdej witryny wywołania.


Pakiet exec

func Command

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

Polecenie zwraca strukturę Cmd, aby wykonać nazwany program z podanymi argumentami.

Zwracane pole Args Cmd jest konstruowane z nazwy polecenia, po której następują elementy arg, więc argument nie powinien zawierać samej nazwy polecenia. Na przykład Command („echo”, „cześć”)


Na przykład,

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))
}

Wynik:

hello world
peterSO
źródło
10

Listę argumentów poleceń można pobrać z funkcji pakietu flagArgs() . Następnie możesz przekazać to do funkcji za pomocą zróżnicowanego stylu wprowadzania danych ( func(input...))

Ze specyfikacji :

Jeśli f jest wariadyczne z końcowym typem parametru ... T, to w funkcji argument jest równoważny parametrowi typu [] T. Przy każdym wywołaniu f argumentem przekazanym do końcowego parametru jest nowy wycinek typu [] T, którego kolejne elementy są faktycznymi argumentami, które muszą być przypisane do typu T.

Przykład:

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
}

Zobacz GO specyfikację dla więcej szczegółów.

Plac zabaw

Intermernet
źródło
5

func Command

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

Polecenie zwraca strukturę Cmd, aby wykonać nazwany program z podanymi argumentami.

Musisz więc wyodrębnić polecenie, które znajduje się w, sliceA[0]a następnie przekazać wszystkie argumenty za pomocą wariady, ale usuwając polecenie sliceA[1:]....

import "os/exec"
import "strings"
func main(){
    plainCommand  := "echo hello world"
    sliceA := strings.Fields(plainCommand)
    cmd := exec.Command(sliceA[0], sliceA[1:]...)
}
Nathenapse
źródło