golang 平行赋值探讨

jmycanfly · · 2321 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

对于golang, 交换两个数很简单,如下这么写就可以了: ``` i, j = j, i ``` 等号左边和右边含有多个表达式,这就是平行赋值。 赋值分为两个步骤: 1. 计算等号左边的操作数的索引表达式和取址表达式,计算等号右边的表达式。 2. 赋值 我们来看下面一段代码会输出什么? ``` 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并发编程一书》

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2321 次点击  
加入收藏 微博
3 回复  |  直到 2021-04-13 11:46:29
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传