Golang:变量参数

时间:2015-10-13 02:08:55

标签: go

编译以下程序时

func myPrint(v ...interface{}) {
        fmt.Println("Hello", v...)
}
func main() {
    myPrint("new", "world")
}

我收到编译错误

too many arguments in call to fmt.Println

我认为v ...将扩展为第2,第3个参数,fmt.Println将看到三个项可变参数列表。我认为这相当于

fmt.Println("Hello", "new", "world")

为什么会出错。

2 个答案:

答案 0 :(得分:4)

试试这个。它为可变参数添加Hello,然后使用println一次打印所有参数。

package main

import "fmt"

func myPrint(v ...interface{}) {
    a := append([]interface{}{"Hello"}, v...)   // prepend "Hello" to variadics
    fmt.Println(a...)                           // println the whole lot
}
func main() {
    myPrint("new", "world")
}

答案 1 :(得分:2)

您在调用fmt.Println()时误用了可变速记。你实际发送的是2个参数:一个字符串,然后展开interface{}类型的切片。函数调用不会将其连接到单个切片中。

此设计将编译并运行您期望的结果:

func myPrint(v ...interface{}) {
    fmt.Print("Hello ")
    fmt.Println(v...)
}

func main() {
    myPrint("new", "world")
}