Come posso passare una fetta come input variadico?


89

Ho una funzione func more(... t). Mi chiedo se sia possibile utilizzare una slice per popolare un elenco di argomenti ....

Sto cercando di risolvere il seguente programma. Fondamentalmente per imitare una normale shell che riceve il comando come una stringa. La funzione di comando richiede una "lista" di argomenti e non vedo come posso convertire una stringa in una tale lista

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

Risposte:


103

La specifica del linguaggio di programmazione Go

Passaggio di argomenti a ... parametri

Se f è variadico con il tipo di parametro finale ... T, allora all'interno della funzione l'argomento è equivalente a un parametro di tipo [] T. Ad ogni chiamata di f, l'argomento passato al parametro finale è una nuova fetta di tipo [] T i cui elementi successivi sono gli argomenti effettivi, che devono essere tutti assegnabili al tipo T. La lunghezza della fetta è quindi il numero di argomenti legati al parametro finale e possono differire per ogni sito di chiamata.


Pacchetto exec

comando func

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

Il comando restituisce la struttura Cmd per eseguire il programma denominato con gli argomenti forniti.

Il campo Args del Cmd restituito è costruito dal nome del comando seguito dagli elementi di arg, quindi arg non dovrebbe includere il nome del comando stesso. Ad esempio, Command ("echo", "hello")


Per esempio,

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

Produzione:

hello world

11

Un elenco di argomenti del comando può essere recuperato dalla funzione flag packageArgs() . Puoi quindi passare questo a una funzione usando lo stile di input variadico ( func(input...))

Da l'Spec :

Se f è variadico con il tipo di parametro finale ... T, allora all'interno della funzione l'argomento è equivalente a un parametro di tipo [] T. Ad ogni chiamata di f, l'argomento passato al parametro finale è una nuova fetta di tipo [] T i cui elementi successivi sono gli argomenti effettivi, che devono essere tutti assegnabili al tipo T.

Esempio:

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
}

Vedi la specifica Go per maggiori dettagli.

Terreno di gioco


6

comando func

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

Il comando restituisce la struttura Cmd per eseguire il programma denominato con gli argomenti forniti.

Quindi devi estrarre il comando che si trova in sliceA[0]e poi passare tutti gli argomenti con un variadic ma rimuovendo il comando sliceA[1:]....

import "os/exec"
import "strings"
func main(){
    plainCommand  := "echo hello world"
    sliceA := strings.Fields(plainCommand)
    cmd := exec.Command(sliceA[0], sliceA[1:]...)
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.