在Go中为多个变量赋值

pav*_*163 4 go

我最近想到了这个:

func main() {
    x, y := 0, 1
    x, y = y, x+y
    fmt.Println(y)
}
Run Code Online (Sandbox Code Playgroud)

我的想法是:

x, y = y, x+y
Run Code Online (Sandbox Code Playgroud)

与以下相同:

x = y
y = x+y
Run Code Online (Sandbox Code Playgroud)

这将导致最终值 x = 1, y = 2

然而,我得到的最终价值是 x = 1, y = 1

这是为什么?

谢谢.

nus*_*tin 7

这是如何指定的:

转让分两个阶段进行.首先,左边的索引表达式和指针间接(包括选择器中的隐式指针间接)的操作数和右边的表达式都按照通常的顺序进行评估.其次,分配按从左到右的顺序进行.

赋值首先评估右侧的所有表达式,然后将结果分配给左侧的变量.

您的

x, y = y, x+y
Run Code Online (Sandbox Code Playgroud)

基本上相当于此

tmp1 := y
tmp2 := x+y
x = tmp1
y = tmp2
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用此事实在一行中交换2个变量,如下所示:

a, b = b, a
Run Code Online (Sandbox Code Playgroud)