Como posso passar uma fatia como uma entrada variável?

86

Eu tenho uma função func more(... t). Estou me perguntando se é possível usar uma fatia para preencher uma lista de argumentos ....

Estou tentando resolver o seguinte programa. Basicamente, para imitar um shell normal que recebe o comando como uma string. A função de comando requer uma "lista" de argumentos e não vejo como posso converter uma string em tal lista

    import "os/exec"
    import "strings"
    func main(){
        plainCommand  := "echo hello world"
        sliceA := strings.Fields(plainCommand)
        cmd := exec.Command(sliceA)
    }
O usuário sem chapéu
fonte

Respostas:

101

A especificação da linguagem de programação Go

Passando argumentos para ... parâmetros

Se f for variável com o tipo de parâmetro final ... T, então, dentro da função, o argumento é equivalente a um parâmetro do tipo [] T. Em cada chamada de f, o argumento passado para o parâmetro final é uma nova fatia do tipo [] T cujos elementos sucessivos são os argumentos reais, que devem ser atribuídos ao tipo T. O comprimento da fatia é, portanto, o número de argumentos vinculados ao parâmetro final e podem diferir para cada site de chamada.


Package exec

função Comando

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

O comando retorna a estrutura Cmd para executar o programa nomeado com os argumentos fornecidos.

O campo Args do Cmd retornado é construído a partir do nome do comando seguido pelos elementos de arg, portanto, arg não deve incluir o próprio nome do comando. Por exemplo, Command ("echo", "hello")


Por exemplo,

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

Resultado:

hello world
PeterSO
fonte
10

Uma lista de argumentos de comando pode ser recuperada da função de pacote de sinalizaçãoArgs() . Você pode então passar isso para uma função usando o estilo de entrada variável ( func(input...))

Das especificações :

Se f for variável com o tipo de parâmetro final ... T, então, dentro da função, o argumento é equivalente a um parâmetro do tipo [] T. A cada chamada de f, o argumento passado para o parâmetro final é uma nova fatia do tipo [] T, cujos elementos sucessivos são os argumentos reais, que devem ser atribuídos ao tipo T.

Exemplo:

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 as especificações Go para obter mais detalhes.

Parque infantil

Internet
fonte
5

função Comando

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

O comando retorna a estrutura Cmd para executar o programa nomeado com os argumentos fornecidos.

Então você tem que extrair o comando que é encontrado em sliceA[0]e então passar todos os argumentos com uma variável, mas removendo o 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
fonte