Golang多值赋值

Golang multiple assignment

Posted by alovn on August 18, 2023

Golang和Python一样使用了多值赋值的语法,它在很多地方可以简化代码,不过有时也会让人产生困惑。

示例一

1
2
3
4
5
6
7
8
9
10
package main

import "fmt"

func main() {
	x := []int{1, 2, 3}
	i := 0
	i, x[i] = 1, 2
	fmt.Println(i, x)
}

上面代码由于左侧有索引取值表达式,会先确认左侧索引的地址。这里会首先计算x[i]中索引i的值,此时i=0, 从左到右依次赋值,赋值操作相当于:

1
x, x[0] = 1, 2

所以上面会输出:

1
1 [2, 2, 3]

示例二

1
2
3
4
5
6
7
8
9
10
package main

import "fmt"

func main() {
	x := []int{1, 2, 3}
	i := 0
	x[i], i = 2, x[i]
	fmt.Println(i, x)
}

这里赋值语句的左右两侧都存在x[i]索引,首先需要计算索引i的值,此时i=0,赋值语句等同于:

1
x[0], i = 2, x[0]

由于x[0]是左侧的操作数,编译器会创建一个临时变量,并将这个临时变量赋值为x[0], 此时赋值语句相当于:

1
2
tmp := x[0]
x[0], i = 2, tmp

然后再从左到右依次赋值,并输出:

1
1, [2, 2, 3]