golang中的元组赋值

元组赋值原理

Posted by John Mactavish on July 23, 2019

简介

  我刷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