您现在的位置是:亿华云 > 应用开发
Go 语言怎么使用变长参数函数?
亿华云2025-10-02 14:21:23【应用开发】6人已围观
简介01介绍Go 语言中函数的最后一个参数可以是变长参数,细心的读者朋友们可能已经发现,在 Go 语言标准库fmt包中就有使用变长参数函数,比如Println和Printf。我们在使用 Go 语言开发

Go 语言中函数的使用最后一个参数可以是变长参数,细心的变长读者朋友们可能已经发现,在 Go 语言标准库 fmt包中就有使用变长参数函数,参数比如 Println 和 Printf。函数
我们在使用 Go 语言开发应用程序时,使用也可以在合适的变长场景使用变长参数函数,使我们的参数代码更优雅。
02 变长参数顾名思义,函数变长参数是使用指参数的数量不固定,可以是变长 0 个,1 个或多个。参数变长参数的函数格式是 ...T,在参数的使用类型前面有 3 个 .,表示该参数是变长变长参数。
变长参数在函数体内是参数切片类型的参数,也就是说 ...T 等价于 []T。
变长参数在函数外部可匹配的参数类型有两种,站群服务器分别是一个 []T 切片类型的变量,和多个 T 类型的变量,并且二者不可以同时使用,也就是说它们不能同时出现在函数的参数列表中。
03 变长参数函数我们已经知道什么是变长参数,自然我们也就可以想到接受 ...T 形式的形参的函数就是变长参数函数。
一个变长参数函数只能有一个 ...T 形式的形参,并且该形参必须是函数参数列表中的最后一个形参。
需要注意的是,变长参数函数最容易踩的“坑”就是形参和实参的类型不匹配,例如以下这段代码:
func sum(args ...interface{ }) {
res := 0
for _, v := range args {
res += v.(int)
}
fmt.Println(res)
}
func main() {
num := []int{ 1, 2, 3}
sum(num...)
}输出结果:
./prog.go:18:6: cannot use num (variable of type []int) as type []interface{ } in argument to sum阅读上面这段代码,我们发现程序运行错误的原因是实参类型和形参类型不一致,导致编译错误。亿华云计算可能有读者朋友们感到疑惑,int 类型的变量可以直接赋值给 interface{ } 类型的变量,为什么会报错呢?
这是因为实参的类型是 []int,它不能匹配形参 []interface{ }。修改该错误也简单,只需将实参的类型修改为 []interface{ }。
num := []interface{ }{ 1, 2, 3}04 使用场景我们了解完变长参数和变长参数函数,再通过一个示例代码加深一下读者朋友们的理解。
该使用场景是通过调用下游方法,输入用户的个人资料。但是,后期调用的下游方法的入参发生变化,新增了一个或多个请求参数。
如果不使用变长参数,我们原来调用该下游方法的代码都需要随之修改。以下是示例代码:
变更前的示例代码:
func CallUserCenter(name string, age int, gender string) (detail *User, err error) {
detail, err = NewUserUsecase().Create(name, age, gender)
if err != nil {
return
}
return
}变更后的示例代码:
func CallUserCenter(name string, age int, gender string, args ...interface{ }) (detail *User, err error) {
if len(args) == 0 {
detail, err = NewUserUsecase().Create(name, age, gender)
} else {
detail, err = NewUserUsecase().Create(name, age, gender, args[0])
}
if err != nil {
return
}
return
}调用函数的服务器租用示例代码:
func main() {
name := "frank"
age := 18
gender := "male"
detail, err := CallUserCenter(name, age, gender)
if err != nil {
fmt.Printf("err=%v\n", err)
return
}
fmt.Printf("name:%s\nage:%d\ngender:%s\n", detail.name, detail.age, detail.gender)
fmt.Printf("%s\n", "
很赞哦!(7332)