如何将切片作为可变参数传递?

The*_*hat 64 go

我有一个功能func more(... t).我想知道是否可以使用切片来填充参数列表....

我正在尝试解决以下程序.基本上模仿以字符串形式接收命令的普通shell. 命令函数需要一个参数的"列表",我不知道如何将字符串转换为这样的列表

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

pet*_*rSO 81

Go编程语言规范

将参数传递给...参数

如果f是具有最终参数类型... T的可变参数,则在函数内该参数等效于类型为[] T的参数.在f的每次调用中,传递给final参数的参数是一个类型为[] T的新切片,其连续元素是实际参数,所有参数必须可分配给类型T.因此切片的长度是绑定到最终参数的参数可能因每个调用站点而异.


包exec

func命令

func Command(name string, arg ...string) *Cmd
Run Code Online (Sandbox Code Playgroud)

Command返回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))
}
Run Code Online (Sandbox Code Playgroud)

输出:

hello world
Run Code Online (Sandbox Code Playgroud)


Int*_*net 6

可以从标志包Args()函数中检索命令参数列表.然后,您可以使用可变参数输入样式(func(input...))将其传递给函数

来自规格:

如果f是具有最终参数类型... T的可变参数,则在函数内该参数等效于类型为[] T的参数.在f的每次调用中,传递给final参数的参数是一个类型为[] 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
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅The Go规范.

操场


小智 6

func 命令

func Command(name string, arg ...string) *Cmd
Run Code Online (Sandbox Code Playgroud)

Command 返回 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:]...)
}
Run Code Online (Sandbox Code Playgroud)