
Go 的多重赋值(如 a, b = b, a+b)并非按顺序逐行执行,而是先同时求值右侧所有表达式,再依次赋值给左侧变量,因此能安全实现变量交换或斐波那契迭代等操作。
go 的多重赋值(如 `a, b = b, a+b`)并非按顺序逐行执行,而是先**同时求值右侧所有表达式**,再**依次赋值给左侧变量**,因此能安全实现变量交换或斐波那契迭代等操作。
在 Go 中,多重赋值(也称并行赋值或元组赋值)具有明确且关键的语义:右侧表达式在任何赋值发生前被完全求值,并保存临时结果;随后左侧变量按从左到右顺序接收这些预计算值。这与传统顺序赋值有本质区别。
以问题中的代码为例:
x, y := 0, 1 x, y = y, x+y
执行 x, y = y, x+y 时,Go 会:
-
第一阶段(求值):先计算右侧
y和x+y—— 此时x=0,y=1,所以得到tmp1 = 1和tmp2 = 0+1 = 1; -
第二阶段(赋值):再将
tmp1赋给x,tmp2赋给y,最终x = 1,y = 1。
这等价于手动引入临时变量:
tmp1 := y // 1 tmp2 := x+y // 0+1 = 1 x = tmp1 // x ← 1 y = tmp2 // y ← 1
✅ 正确实现斐波那契迭代(下一值依赖原 x 和 y):
x, y := 0, 1 for i := 0; i <p>⚠️ 注意事项:</p>
- 不可用于“链式覆盖”逻辑(如误以为
a, b = b, a后a已更新再参与b计算); - 右侧表达式求值顺序是从左到右,但所有值均基于赋值前的状态;
- 支持混合类型(只要类型匹配),例如
name, age := "Alice", 30; - 若左侧变量未声明,
:=会进行短变量声明;若已声明,则必须用=(且需同作用域)。
正是这一原子性设计,让 Go 能一行完成变量交换(a, b = b, a)、状态迁移(如滚动窗口、状态机)等常见模式,既简洁又无副作用。










