Golang 使用带有变量参数列表
在Golang中,我们可以使用变量参数列表(Variadic Parameter List)来接收不定数量的参数。在函数或方法定义中,我们可以在参数名前加上三个点(…)来表示该参数是一个变量参数列表。即使该参数列表为空,也可以使用该种形式,即 func foo(...int){}。
基本使用
当函数或方法中存在变量参数列表时,我们可以传入任意数量的参数。在函数或方法内部,我们可以像使用普通切片一样使用变量参数列表,其实本质上也是切片。下面是一个简单的使用变量参数列表的示例:
package main
import "fmt"
func sum(nums ...int) {
total := 0
for _, num := range nums {
total += num
}
fmt.Println("Total:", total)
}
func main() {
sum(1, 2, 3, 4, 5)
}
以上代码定义了一个 sum 函数,接收任意数量的整数参数,并计算它们的总和。在 main 函数中,我们通过 sum(1,2,3,4,5) 调用该函数,并传入5个整数参数。
输出结果为:
Total: 15
传入切片
我们可以把切片中的元素作为参数传递给使用变量参数列表的函数或方法。这时候需要使用 ... 运算符将切片元素打散,使其成为独立的参数。
下面是一个示例,将一个包含多个元素的切片 numbers 作为参数传递给 sum 函数。
package main
import "fmt"
func sum(nums ...int) {
total := 0
for _, num := range nums {
total += num
}
fmt.Println("Total:", total)
}
func main() {
numbers := []int{1, 2, 3, 4, 5}
sum(numbers...)
}
输出结果为:
Total: 15
变量参数列表和其他参数
当函数或方法中存在变量参数列表时,我们还可以使用普通的参数和变量参数列表组合来实现更复杂的功能。下面是一个功能较为复杂的示例,该示例将一个公司的多个员工信息合并成一个总的员工信息。
package main
import (
"fmt"
"strings"
)
type Employee struct {
name string
occupation string
salary float64
}
func mergeEmployee(lastEmployee Employee, employees ...Employee) Employee {
mergedEmployee := lastEmployee
for _, employee := range employees {
mergedEmployee.salary += employee.salary
if strings.Contains(mergedEmployee.name, employee.name) {
continue
} else {
mergedEmployee.name += "," + employee.name
}
}
return mergedEmployee
}
func main() {
employee1 := Employee{"Sam", "developer", 6000.0}
employee2 := Employee{"Jack", "PM", 7000.0}
employee3 := Employee{"Rose", "marketing", 5000.0}
totalEmployee := mergeEmployee(Employee{"", "", 0}, employee1, employee2, employee3)
fmt.Println("total employee:", totalEmployee)
}
以上代码定义了一个 Employee 结构体,包含员工的姓名、职位和薪水。然后定义了一个 mergeEmployee 函数,接收多个员工作为参数,并将它们的信息合并到最后一个员工中。在 main 函数中,我们定义了多个员工,并将它们传递给 mergeEmployee 函数。
输出结果为:
total employee: {Sam,Jack,Rose developer|PM|marketing 18000}
变量参数列表与函数类型
变量参数列表同样可以用于函数类型。下面是一个示例,定义了一个 multiplier 函数类型,能够接收任意数量的整数,计算它们的积。
package main
import "fmt"
type multiplier func(...int) int
func multiply(nums ...int) int {
result := 1
for _, num := range nums {
result *= num
}
return result
}
func main() {
multiplyNums := multiplier(multiply)
product := multiplyNums(2, 3, 4, 5)
fmt.Println("Product:", product)
}
以上代码定义了一个 multiplier 函数类型,可以接收任意数量的整数参数,并返回它们的积。然后将 multiply 函数赋值给该类型。在 main 函数中,我们创建了一个 multiplyNums 变量,将 multiply 函数赋值给它,并传入多个参数,计算它们的积。
输出结果为:
Product: 120
如何避免变量参数列表滥用
变量参数列表非常灵活,能够接收任意数量的参数。但如果使用不当,也容易出现滥用的情况。因此在使用变量参数列表时,需要遵守一定的规则。
- 仅在确实需要不定数量参数时使用。如果函数参数数量固定,可以使用普通的参数来替代变量参数列表,使函数更明确。
-
确保变量参数列表在参数列表的最后。这可以使编写代码和读取代码更清晰,并在遍历时更容易理解。
-
在文档或函数签名中清晰地描述变量参数的处理方式。包括变量参数的使用方式、参数的格式和参数的含义等。
结论
使用变量参数列表可以使我们编写更灵活的函数或方法,能够接收任意数量的参数。在设计和编写函数时,需要注意变量参数列表的使用规则,保证函数的可读性和可维护性。
极客笔记