来源:自学PHP网 时间:2019-08-07 16:47 作者:小飞侠 阅读:次
[导读] 关于golang中平行赋值浅析...
对于golang, 交换两个数很简单,如下这么写就可以了: i, j = j, i 等号左边和右边含有多个表达式,这就是平行赋值。 赋值分为两个步骤:
我们来看下面一段代码会输出什么? func main() { i := 1 s := []string{"A", "B", "C"} i, s[i-1] = 2, "Z" fmt.Printf("s: %v \n", s) } 这里输出的 s: [Z,B,C] 而不是s: [A,Z,C]。 这是因为等号左边的切片的索引表达式i-1会被先计算,最后才是赋值。 计算和赋值的顺序,都是从左往右。 我们再来看下面的代码会输出什么? func main() { a := []int{1, 2, 3, 4} defer func(a []int) { fmt.Printf("a: %v\n", a) }(a) a[0], a[4] = a[1], a[2] } 输出的是: a: [2 2 3 4] panic: runtime error: index out of range goroutine 1 [running]: 在赋值的过程中,即使后面的引发了panic,前面的也会被赋值成功。 再看这个会输出什么? func main() { a := []int{1, 2, 3, 4} defer func(a []int) { fmt.Printf("a: %v\n", a) }(a) a[0], a[1] = a[2], a[4] } 输出的是: a: [1 2 3 4] panic: runtime error: index out of range goroutine 1 [running]: main.main() 再次理解一下,赋值的第一步,计算等号左边的索引表达式,取址表达式 和 计算等号右边的表达式。 理解参照了《Go并发编程一书》 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对自学php网的支持。 |
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com