关于golang中平行赋值浅析
对于golang,交换两个数很简单,如下这么写就可以了:
i,j=j,i
等号左边和右边含有多个表达式,这就是平行赋值。赋值分为两个步骤:
- 计算等号左边的操作数的索引表达式和取址表达式,计算等号右边的表达式。
- 赋值
我们来看下面一段代码会输出什么?
funcmain(){
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会被先计算,最后才是赋值。计算和赋值的顺序,都是从左往右。我们再来看下面的代码会输出什么?
funcmain(){
a:=[]int{1,2,3,4}
deferfunc(a[]int){
fmt.Printf("a:%v\n",a)
}(a)
a[0],a[4]=a[1],a[2]
}
输出的是:
a:[2234] panic:runtimeerror:indexoutofrange goroutine1[running]:
在赋值的过程中,即使后面的引发了panic,前面的也会被赋值成功。再看这个会输出什么?
funcmain(){
a:=[]int{1,2,3,4}
deferfunc(a[]int){
fmt.Printf("a:%v\n",a)
}(a)
a[0],a[1]=a[2],a[4]
}
输出的是:
a:[1234] panic:runtimeerror:indexoutofrange goroutine1[running]: main.main()
再次理解一下,赋值的第一步,计算等号左边的索引表达式,取址表达式和计算等号右边的表达式。
理解参照了《Go并发编程一书》
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。