您现在的位置是:亿华云 > 应用开发

Go 语言怎么使用变长参数函数?

亿华云2025-10-02 14:21:23【应用开发】6人已围观

简介01介绍Go 语言中函数的最后一个参数可以是变长参数,细心的读者朋友们可能已经发现,在 Go 语言标准库fmt​包中就有使用变长参数函数,比如Println​和Printf。我们在使用 Go 语言开发

01 介绍

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)