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

问题描述 投票:0回答:3

我有一个功能

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

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

import "os/exec"
import "strings"
func main(){
    plainCommand  := "echo hello world"
    sliceA := strings.Fields(plainCommand)
    cmd := exec.Command(sliceA)
}
go parameter-passing slice variadic-functions
3个回答
148
投票

Go 编程语言规范

将参数传递给...参数

如果 f 是最终参数类型 ...T 的可变参数,则在 函数参数相当于 []T 类型的参数。在 每次调用 f,传递给最终参数的参数都是一个新的 []T 类型的切片,其连续元素是实际参数, 所有这些都必须可分配给类型 T。切片的长度是 因此绑定到最终参数的参数数量可以 每个呼叫站点都不同。


包执行

func 命令

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

Command 返回 Cmd 结构以执行指定的程序 给定论据。

返回的Cmd的Args字段是根据命令名称构造的 后跟 arg 的元素,因此 arg 不应包含命令 自己命名。例如,命令(“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))
}

输出:

hello world

23
投票

可以从 flag 包

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

来自规格

如果 f 是最终参数类型为 ...T 的可变参数,则在函数内该参数相当于 []T 类型的参数。每次调用 f 时,传递给最终参数的参数是 []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
}

请参阅 Go 规范 了解更多详细信息。

游乐场


8
投票

func 命令

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

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:]...)
}
© www.soinside.com 2019 - 2024. All rights reserved.