简介
我刷LeetCode上的链表算法题时,需要用到元组赋值,让我有点困惑,于是我了解了一下它的原理。
元组赋值或者叫平行赋值,就是形如x,y=a,b的赋值形式,允许同时出现在赋值语句
左右两边的变量。例如我们可以这样交换两个变量的值:
x, y = y, x
原理
我查看了《GO语言圣经》,上面关于元组赋值这样介绍:
元组赋值是另一种形式的赋值语句,它允许同时更新多个变量的值。在赋值之前,赋值语句右边的所有 表达式将会先进行求值,然后再统一更新左边对应变量的值。
因此,我推断原理相当于是这样的:
右边的所有表达式先进行求值,在内存其它位置暂时存放它们的值,然后同时分配给左边。
例1
func main() { i := 1 s := []string{"A", "B", "C"} i, s[i-1] = 2, "Z" //s[i-1]的i取原值 1,因为计算左侧地址时,同时赋值还未进行 fmt.Printf("s: %v \n", s) // s: [Z,B,C] }
例2
func main() { //一个赋值panic,另一个正常赋值 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 }
例3
func main() { //计算右侧表达式时panic,所有赋值无法进行 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 }
参考
《GO语言圣经》
jiang_mingyi的CSDN博客 ```
最后附上GitHub:https://github.com/gonearewe