下面代码输出正确的是?

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

Go在线运行

知识点:多重赋值

多重赋值分为两个步骤,并且有严格的先后顺序:

  1. 计算阶段: 首先计算等号左边的索引表达式和取址表达式,然后再计算等号右边的所有表达式。 注意,这里是 先左后右,但是 左侧内部是从左往右计算
  2. 赋值阶段: 将计算出的右侧表达式的值,按照从左到右的顺序,依次赋值给左侧相应的变量。

重点

  • 计算阶段先计算左侧索引,如果索引涉及到变量,此时变量的值就是参与索引计算的值。
  • 赋值阶段的顺序是从左到右。

本例解析

在本例中,会首先计算 s[i-1]。此时 i 的值为 1,所以计算的是 s[0]。等号右边的两个表达式都是常量,计算结果分别为 2 和 “Z”。 然后执行赋值,因此赋值运算等同于 i, s[0] = 2, "Z"