我有一个函数func more(... t)
。我想知道是否可以使用切片来填充参数列表...
。
我正在尝试解决以下程序。基本上模仿以字符串形式接收命令的普通shell。 Command函数需要一个参数“列表”,我不知道如何将字符串转换为这样的列表
import "os/exec"
import "strings"
func main(){
plainCommand := "echo hello world"
sliceA := strings.Fields(plainCommand)
cmd := exec.Command(sliceA)
}
答案 0 :(得分:71)
The Go Programming Language Specification
Passing arguments to ... parameters
如果f是具有最终参数类型的可变参数... T,那么在 function该参数等效于[] T类型的参数。在 每次调用f,传递给final参数的参数都是新的 type [] T的切片,其连续元素是实际参数, 所有都必须分配给类型T.切片的长度是 因此,绑定到最终参数的参数的数量可以 每个呼叫站点都有所不同。
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
答案 1 :(得分:5)
可以从flag package Args()
function检索命令参数列表。然后,您可以使用可变参数输入样式(func(input...)
)
来自the Spec:
如果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
}
有关详细信息,请参阅The Go spec。
答案 2 :(得分:0)
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:]...)
}