引言
可变函数是一个接受0、1或多个值作为单个参数的函数。虽然可变函数不是常见的情况,但它们可以使你的代码更清晰、更可读。
变长函数比它们看起来更常见。最常见的是’fmt’包中的Println
函数。
func Println(a ...interface{
}) (n int, err error)
一个[函数]的参数前面有一组省略号(…
)被认为是可变函数。省略号表示提供的参数可以是0、1或多个值。对于fmt.Println
包,它声明参数a
是可变的。
让我们创建一个使用fmt.Println
函数并传入0、1或多个值的程序:
print.go
package main
import "fmt"
func main() {
fmt.Println()
fmt.Println("one")
fmt.Println("one", "two")
fmt.Println("one", "two", "three")
}
第一次调用fmt.Println
时,我们没有传递任何参数。第二次调用fmt.Println
时,我们只传入了一个参数,值为one
。然后我们传递one
和two
,最后传递one
、two
和three
。
让我们用下面的命令运行这个程序:
go run print.go
We’ll see the following output:
Output
one
one two
one two three
输出的第一行是空的。这是因为我们在第一次调用fmt.Println
时没有传递任何参数。第二次打印one
的值。然后one
和two
,最后one
,two
和three
。
现在我们已经看到了如何调用可变函数,让我们看看如何定义我们自己的可变函数。
定义可变参数函数
我们可以通过在参数前使用省略号(…
)来定义变长函数。下面来创建一个程序,当人们的名字被发送给函数时,它会向人们问候:
hello.go
package main
import "fmt"
func main() {
sayHello()
sayHello("Sammy")
sayHello("Sammy", "Jessica", "Drew", "Jamie")
}
func sayHello(names ...string) {
for _, n := range names {
fmt.Printf("Hello %s\n", n)
}
}
我们创建了一个sayHello
函数,它只接受一个名为names
的参数。这个参数是可变的,因为我们在数据类型前面加了一个省略号(...
):...string
。这告诉Go函数可以接受0个、1个或多个参数。
sayHello
函数接收的names
参数是[slice
],因为数据类型是[string
],所以names
参数在函数体内可以被视为字符串的切片([]string
)。我们可以使用[range
]操作符创建一个循环并遍历字符串切片。
运行这个程序,会得到如下输出:
OutputHello Sammy
Hello Sammy
Hello Jessica
Hello Drew
Hello Jamie
注意,第一次调用sayHello
时没有输出任何内容。这是因为可变参数是string
的空slice
。因为我们正在遍历切片,所以没有任何东西需要遍历,并且fmt.Printf
永远不会被调用。
下面来修改程序,以检测没有发送值:
hello.go
package main
import "fmt"
func main() {
sayHello()
sayHello