go语言的多重赋值(如 `a, b = b, a+b`)先整体求值右侧表达式,再依次赋值到左侧变量,因此右侧所有操作数均基于赋值前的原始值计算,确保原子性与可预测性。
在Go中,a, b = b, a+b 这类多重赋值语句的执行严格遵循官方规范定义的两阶段规则:
赋值分两个阶段进行: 求值阶段:先从左到右计算左侧所有索引/解引用操作数(如 x[i]、p.field),同时从左到右计算右侧所有表达式; 赋值阶段:再从左到右,将已计算好的右侧值依次赋给左侧变量。
关键点在于:右侧表达式全部在任何赋值发生前完成求值,且使用的是赋值开始前的变量快照值。
以你的示例代码为例:
var a int = 0 var b int = 1 a, b = b, a+b // ← 多重赋值
执行过程如下:
-
✅ 求值阶段(使用旧值):