Go 围棋:关于多重作业的困惑

Go 围棋:关于多重作业的困惑,go,Go,我对围棋中的多个赋值有点困惑,例如varA,varB=varC,varD 我的问题是,这样的操作是原子的吗(当然不是在硬件层,而是从程序员的角度) 就我个人而言,我希望它是原子的,所以这个表达式a,b=b,a只是交换值。我试过了,是的,就是这样 另一方面,缔约国: 转让分两个阶段进行。首先,左侧的索引表达式和指针间接(包括选择器中的隐式指针间接)的操作数和右侧的表达式都按通常的顺序求值其次,作业按从左到右的顺序执行。 我理解为a被分配b的值,然后b被分配a的值(现在是b),所以最后a和b都等于b

我对围棋中的多个赋值有点困惑,例如
varA,varB=varC,varD

我的问题是,这样的操作是原子的吗(当然不是在硬件层,而是从程序员的角度)

就我个人而言,我希望它是原子的,所以这个表达式
a,b=b,a
只是交换值。我试过了,是的,就是这样

另一方面,缔约国:

转让分两个阶段进行。首先,左侧的索引表达式和指针间接(包括选择器中的隐式指针间接)的操作数和右侧的表达式都按通常的顺序求值其次,作业按从左到右的顺序执行。

我理解为
a
被分配
b
的值,然后
b
被分配
a
的值(现在是
b
),所以最后
a
b
都等于
b
的原始值


规格是错误的还是我误解了?

你误解了,这不是你误解的第二部分

说明书上说:

首先,左侧的索引表达式和指针间接(包括选择器中的隐式指针间接)的操作数和右侧的表达式都是按通常顺序计算的

这里的evaluated是指所有表达式,包括变量,都被计算为值,并且该值在当时是固定的。因此在
a,b=b,a
中,在第一部分中,lhs表达式
a,b
得到了解析,rhs表达式
b,a
得到了类似
5,3
的评估(当然,假设
a,b:=3,5
);在第二部分,赋值发生了,变成
a=5;b=3

该评估与使用延迟和goroutine时发生的情况相同。这就是为什么下面的代码打印5

func T() {
    x := 5
    defer func(i int) {
        fmt.Println(i)
    }(x)
    x = 3
}