多语种网站建设方案,淘宝建设网站的理由,怎么用视频做网站背景,怎么做好手机网站开发文章目录1 定义2 语法3 给可变函数参数传入切片4 修改可变参数函数中的切片1 定义
可变参数函数是一种参数个数可变的函数。
2 语法 语法 //关键字 函数名(参数1#xff0c; elems为T类型的可变参数) 返回值类型
func name(params type, elems ...T) returntype{// 函数体
}…
文章目录1 定义2 语法3 给可变函数参数传入切片4 修改可变参数函数中的切片1 定义
可变参数函数是一种参数个数可变的函数。
2 语法 语法 //关键字 函数名(参数1 elems为T类型的可变参数) 返回值类型
func name(params type, elems ...T) returntype{// 函数体
}slice的append就是一个可变参数的内部函数 func append(slice []Type, elems ...Type) []Type可变参数示例1 package mainimport fmtfunc find(target int, group ...int) int {ishit : falseindex : 0for i, v : range group {if target v {fmt.Printf(找到元素值:%d,在索引位置:%d\n, v, i)ishit trueindex i}}if !ishit {return -1} else {return index}}func main() {find(7, 1, 2, 3, 4, 5)
} 可变参数示例2 package mainimport fmtfunc add(base int, group ...int) {total : 0for _, v : range group {total v}total basefmt.Println(total , total)
}func main() {add(100, 1, 2, 3, 4, 5)
}
可变参数函数的工作原理是把可变参数转换为一个新的切片然后被传入函数中。
3 给可变函数参数传入切片
package mainimport fmtfunc find(a int, elems ...int) {for i, v : range elems {if v a {fmt.Printf(found value %d, at index %d, v, i)break}}
}func main() {a : []int{1, 2, 3, 4, 5}find(1, a) // cannot use a (type []int) as type int in argument to find}
将切片直接传递给可变参数明显是不可以的但是可以通过一个语法糖解决这个问题。 将切片传入函数的可变参数位置报错的原因分析 多变参数将接收到的参数做为一个切片如果直接传递一个切片会出现下面这种情况
// 1 函数原型
func find(a int, elems ...int) // 2 函数参数 为切片a 传递到find 等同于 []int{a}
// 因为切片要求的元素类型为int传入的确是一个[]int,所以报错
cannot use a (type []int) as type int in argument to find
// 3 go给出的报错信息很友好如何能够将切片直接传递给可变参数函数 有一个可以直接将切片传入可变参数函数的语法糖你可以在在切片后加上 … 后缀。如果这样做切片将直接传入函数不再创建新的切片 修改上面的函数 package mainimport fmtfunc find(a int, elems ...int) {for i, v : range elems {if v a {fmt.Printf(found value %d, at index %d, v, i)break}}
}func main() {a : []int{1, 2, 3, 4, 5}find(1, a...) // cannot use a (type []int) as type int in argument to find}
4 修改可变参数函数中的切片
如果使用切片…那么会将切片直接传递给函数不会再创建新的切片这也意味着如果再可变参数函数内部修改了切片会影响到创建切片的位置这可能比较抽象直接看一个例子就好了。 示例一 package mainimport fmtfunc changeTest(s ...string) {s[0] 上树捉鸟s[1] 下河洗澡
}func main() {s : []string{好好学习, 天天向上}fmt.Println(传递前 , s)changeTest(s...) // 将切片传递过去changeTest不会再创建切片fmt.Println(传递后 , s)
} 示例一执行结果 传递前 [好好学习 天天向上]
传递后 [上树捉鸟 下河洗澡]示例2 package mainimport fmtfunc changeTest1(s ...string) {s[0] 上树捉鸟s[1] 下河洗澡s append(s, 窈窕淑女, 君子好逑)fmt.Println(in changeTest: , s)
}func main() {s : []string{好好学习, 天天向上}fmt.Println(传递前 , s)changeTest1(s...) // 将切片传递过去changeTest不会再创建切片fmt.Println(传递后 , s)
} 示例2执行结果 传递前 [好好学习 天天向上]
in changeTest: [上树捉鸟 下河洗澡 窈窕淑女 君子好逑]
传递后 [上树捉鸟 下河洗澡]