对于golang, 交换两个数很简单,如下这么写就可以了:
```
i, j = j, i
```
等号左边和右边含有多个表达式,这就是平行赋值。
赋值分为两个步骤:
1. 计算等号左边的操作数的索引表达式和取址表达式,计算等号右边的表达式。
2. 赋值
我们来看下面一段代码会输出什么?
```
func main() {
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会被先计算,最后才是赋值。
计算和赋值的顺序,都是从左往右。
我们再来看下面的代码会输出什么?
```
func main() {
a := []int{1, 2, 3, 4}
defer func(a []int) {
fmt.Printf("a: %v\n", a)
}(a)
a[0], a[4] = a[1], a[2]
}
```
输出的是:
```
a: [2 2 3 4]
panic: runtime error: index out of range
goroutine 1 [running]:
```
在赋值的过程中,即使后面的引发了panic,前面的也会被赋值成功。
再看这个会输出什么?
```
func main() {
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
goroutine 1 [running]:
main.main()
```
再次理解一下,赋值的第一步,计算等号左边的索引表达式,取址表达式 和 计算等号右边的表达式。
理解参照了《Go并发编程一书》
有疑问加站长微信联系(非本文作者))