如何在Go中使用可变参数函数

本文介绍了如何在Go中使用可变参数函数,包括如何定义、调用以及处理参数顺序。通过示例展示了可变参数如何提升代码的可读性,并解释了参数爆炸的概念,帮助理解如何将切片传递给可变参数函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

可变函数是一个接受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。然后我们传递onetwo,最后传递onetwothree

让我们用下面的命令运行这个程序:

go run print.go

We’ll see the following output:

Output
one
one two
one two three

输出的第一行是空的。这是因为我们在第一次调用fmt.Println时没有传递任何参数。第二次打印one的值。然后onetwo,最后one,twothree

现在我们已经看到了如何调用可变函数,让我们看看如何定义我们自己的可变函数。

定义可变参数函数

我们可以通过在参数前使用省略号()来定义变长函数。下面来创建一个程序,当人们的名字被发送给函数时,它会向人们问候:

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码觉客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值