下面代码输出正确的是?
package main
import "fmt"
func main() {
i := 1
s := []string{"A", "B", "C"}
i, s[i-1] = 2, "Z"
fmt.Printf("s: %v \n", s)
}
- A. s: [Z,B,C]
- B. s: [A,Z,C]
答案:A
知识点:多重赋值
多重赋值分为两个步骤,并且有严格的先后顺序:
- 计算阶段: 首先计算等号左边的索引表达式和取址表达式,然后再计算等号右边的所有表达式。 注意,这里是 先左后右,但是 左侧内部是从左往右计算。
- 赋值阶段: 将计算出的右侧表达式的值,按照从左到右的顺序,依次赋值给左侧相应的变量。
重点
- 计算阶段先计算左侧索引,如果索引涉及到变量,此时变量的值就是参与索引计算的值。
- 赋值阶段的顺序是从左到右。
本例解析
在本例中,会首先计算 s[i-1]。此时 i 的值为 1,所以计算的是 s[0]。等号右边的两个表达式都是常量,计算结果分别为 2 和 “Z”。 然后执行赋值,因此赋值运算等同于 i, s[0] = 2, "Z"。