最近在工作中发现一个坑,关键是这个坑还不报错,所以在此记录一下,顺便也对相关知识点做一个总结。
成都创新互联公司专注为客户提供全方位的互联网综合服务,包含不限于做网站、网站建设、扬中网络推广、重庆小程序开发、扬中网络营销、扬中企业策划、扬中品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;成都创新互联公司为所有大学生创业者提供扬中建站搭建服务,24小时服务热线:18980820575,官方网址:www.cdcxhl.com
关于这个坑,还得从「不定参数」说起。
不定参数,顾名思义,也就是「参数个数不确定」的时候golang支持的一种机制。
我们想实现一个多个数字累加的方法,既然是多个数字,那么数字的个数肯定是不确定的,所以我们可以如下编写。
func NumberSum(args ...int) (res int) { //不定参数的使用示例
for i := range args {
res += i
}
return res
}
func main() {
total := NumberSum(1, 2, 3, 4, 5, 6)
fmt.Println(total)
}
//输出结果
15
通过上面的示例我们可以看出不定参数的使用还是很简单的,只要在参数定义的时候,在「类型前面加上三个点」就可以了。但是不定参数在使用的时候还有其他需要注意的问题需要注意一下。
前面三点其实还是比较好理解的,针对第四点看看下面例子,也是「容易出问题」的地方,而且本文要说的「坑」也和这个有关。
func NumberSum(args ...int) (res int) {
for i := range args {
res += i
}
return res
}
func main() {
//定义了一个切片,准备传给不一定参数
numSelice := []int{1, 2, 3, 4, 5, 6}
//把切片传给不定参数的时候,需要在参数后面加上...
total := NumberSum(numSelice...)
fmt.Println(total)
}
通过上述例子咱们应该已经对不定参数有了一定的掌握,接下来咱们看一个特殊的场景 如果「不定参数的各个参数类型不一样」怎么办?这种场景其实还是很常见的,用interface类型即可解决。比如我们要封装一个生成rediskey的方法。
func MakeRedisKey(key string, args ...interface{}) (redisKey string) {
redisKey = fmt.Sprintf(key, args)
return redisKey
}
func main() {
ucid := 123
name := "test"
key := "key_id_%d_name_%s"
redisKey := MakeRedisKey(key, ucid, name)
fmt.Println(redisKey)
}
//输出结果
key_id_[123 %!d(string=test)]_name_%!s(MISSING)
上面的代码看似没有问题,但是输出结果却看似来就像乱码一样,这是为什么呢?我们来分析一下
func Sprintf(format string, a ...interface{}) string {
........内容是什么不重要
return s
}
我们会发现Sprintf的第二个参数也是「不定参数」。
这就相当于在「MakeRedisKey」中,我们拿着「切片类型」的参数args,去传给一个「不定参数」作为参数,按照我们上面总结的**把切片传给不定参数的时候,需要在参数后面加上...**这条定律,上面代码改成如下即可正常。
func MakeRedisKey(key string, args ...interface{}) (redisKey string) {
redisKey = fmt.Sprintf(key, args...) //在args后面加上...
return redisKey
}
func main() {
ucid := 123
name := "test"
key := "key_id_%d_name_%s"
redisKey := MakeRedisKey(key, ucid, name)
fmt.Println(redisKey)
}
//输出结果
key_id_123_name_test
这样我们就可以得到正常的结果了。最后总结一下,「我们在使用不定参数的时候,尤其是涉及到多次传递的时候,一定不要想当然,记得在中间传递过程中在参数后面加上...」。
网站题目:传个参数都有坑,我蚌埠了!
文章出自:http://www.shufengxianlan.com/qtweb/news10/535160.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联