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
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,赋值语句等同于:
由于x[0]是左侧的操作数,编译器会创建一个临时变量,并将这个临时变量赋值为x[0], 此时赋值语句相当于:
1
2
| tmp := x[0]
x[0], i = 2, tmp
|
然后再从左到右依次赋值,并输出: