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


86

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

我正在尝试解决以下程序。基本上是模仿一个普通的外壳,该外壳以字符串形式接收命令。 命令功能需要一个参数“列表”,我看不到如何将字符串转换为这样的列表

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

Answers:


101

Go编程语言规范

将参数传递给...参数

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


包执行

func命令

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

命令返回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))
}

输出:

hello world

10

可以从标志包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规范

操场


5

func命令

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

命令返回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:]...)
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.