3.3 Go函数可变参数
可变参数(variadic parameters)是一种允许函数接受任意数量参数的机制。它在函数定义中使用 ...type 来声明参数类型,所有传递的参数会被收集为一个切片,函数内部可以像操作普通切片一样处理这些参数。
package main
import "fmt"
func t1(ints ...int) { //可变参数使用方法
}
/*
func t2(ints ...int,s string ,i int) int { // 错误,... 可变参数必须在最后一个位置上
}
func t3(ints ...int,strings ...string) { // 错误,... 可变参数必须在最后一个位置上,可变参数在形参列表中只能出现一次,不可以同时出现两个可变参数
}
func t4(x,y int, z sting, ints ...int ){ //正确,可变参数可以与普通参数混合使用,符合可变参数使用方法
}
*/
func t5(x, y int, ints ...int) {
fmt.Printf("x: %d, y: %d\n", x, y)
fmt.Printf("ints (type: %T): %v, length: %d, capacity: %d\n", ints, ints, len(ints), cap(ints))
}
func main() {
fmt.Println("\nDemonstrating t5:")
t5(10, 20, 30, 40, 50) // 调用 t5,传递普通参数和可变参数
fmt.Println("\nDemonstrating t5 with no variadic arguments:")
t5(10, 20) // 调用 t5,不传递可变参数
}
可变参数切片传递
func t8(x, y int, ints ...int) {
// 按位置传参
//首先要满足位置参数的对应,剩余ints收集、ints将新建一个全新的切片
普通参数按位置
}
*/
}
func main (){
t8(1, 2, 3) //按照位置进行赋值,变长
f8 := []int{1, 2, 3, 4} // 定义切片,将数据存放在切片中
t8(1, 2, f8...) //f8... 方式实际上是没有心切片的创建。f8...只能用在可变参数中。
}
日志记录函数通常需要接受多个参数来拼接日志内容。例如:
func logMessage(level string, messages ...string) {
fmt.Printf("[%s] ", level)
for _, msg := range messages {
fmt.Print(msg, " ")
}
fmt.Println()
}
func main() {
logMessage("INFO", "System started", "PID:", "12345")
logMessage("ERROR", "Disk space is low")
}