¿Cómo puedo pasar una porción como entrada variada?

86

Tengo una función func more(... t) . Me pregunto si es posible usar un segmento para completar una lista de argumentos ....

Estoy intentando resolver el siguiente programa. Básicamente, para imitar un shell normal que recibe el comando como una cadena. La función de comando requiere una "lista" de argumentos y no veo cómo puedo convertir una cadena en tal lista

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

Respuestas:

101

La especificación del lenguaje de programación Go

Pasando argumentos a ... parámetros

Si f es variable con el tipo de parámetro final ... T, entonces dentro de la función el argumento es equivalente a un parámetro de tipo [] T. En cada llamada de f, el argumento que se pasa al parámetro final es un nuevo segmento de tipo [] T cuyos elementos sucesivos son los argumentos reales, todos los cuales deben ser asignables al tipo T. La longitud del segmento es, por lo tanto, el número de argumentos ligados al parámetro final y pueden diferir para cada sitio de llamada.


Paquete ejecutivo

comando func

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

El comando devuelve la estructura Cmd para ejecutar el programa nombrado con los argumentos dados.

El campo Args del Cmd devuelto se construye a partir del nombre del comando seguido de los elementos de arg, por lo que arg no debe incluir el nombre del comando en sí. Por ejemplo, Command ("echo", "hola")


Por ejemplo,

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

Salida:

hello world
peterSO
fuente
10

Se puede recuperar una lista de argumentos de comando de la función del paquete de banderasArgs() . Luego puede pasar esto a una función usando el estilo de entrada variadic ( func(input...))

De la especificación :

Si f es variable con el tipo de parámetro final ... T, entonces dentro de la función el argumento es equivalente a un parámetro de tipo [] T. En cada llamada de f, el argumento pasado al parámetro final es un nuevo segmento de tipo [] T cuyos elementos sucesivos son los argumentos reales, todos los cuales deben ser asignables al tipo T.

Ejemplo:

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
}

Consulte las especificaciones de Go para obtener más detalles.

Patio de recreo

Intermernet
fuente
5

comando func

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

El comando devuelve la estructura Cmd para ejecutar el programa nombrado con los argumentos dados.

Por lo tanto, debe extraer el comando que se encuentra en sliceA[0]y luego pasar todos los argumentos con una variada pero eliminando el 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:]...)
}
Nathenapse
fuente