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
}