
Go 支持类似 Python 的并行赋值语法(如 a, b = b, a),无需临时变量,既合法又符合 Go 语言惯用法,适用于同类型变量间的直接交换。
go 支持类似 python 的并行赋值语法(如 `a, b = b, a`),无需临时变量,既合法又符合 go 语言惯用法,适用于同类型变量间的直接交换。
在 Go 中,变量交换无需借助中间临时变量,语言原生支持多变量并行赋值(parallel assignment),这是 Go 的核心特性之一,也是被官方推荐的惯用写法(idiomatic Go)。
✅ 正确用法:一行完成交换
package main
import "fmt"
func main() {
a, b := 10, 20
fmt.Println("交换前:", a, b) // 交换前: 10 20
a, b = b, a // ✅ 并行赋值 —— 所有右侧表达式先求值,再同时赋给左侧
fmt.Println("交换后:", a, b) // 交换后: 20 10
}
该语法不仅适用于基本类型(int, string, float64 等),也适用于结构体、切片、指针等任意可赋值类型,前提是左右两侧变量数量与类型一一匹配。
⚠️ 注意事项
- 类型必须一致:a, b = b, a 要求 a 和 b 类型相同;若类型不同(如 int 和 string),编译器会报错。
- 求值顺序安全:Go 保证右侧所有表达式先全部求值,再统一赋值给左侧变量,因此不存在“覆盖风险”——这与手动使用 temp 变量逻辑等价,但更简洁。
- 不适用于非地址able 值:不能对函数返回值或字面量直接交换(如 f(), g() = g(), f() 是非法的),因为左侧必须是可寻址的变量(addressable)。
-
支持多变量批量交换:可扩展至任意数量,例如三变量轮换:
x, y, z = y, z, x
✅ 对比:传统 temp 方式(不推荐)
// ❌ 冗余且非惯用 temp := a a = b b = temp
虽然语义正确,但增加了变量声明、破坏了代码简洁性,也不符合 Go 社区推崇的“少即是多”(Less is exponentially more)原则。
总结
Go 的 a, b = b, a 不仅是语法糖,更是语言设计上对清晰性与安全性的兼顾。它简洁、高效、无副作用,是交换两个同类型变量的首选且唯一推荐方式。掌握并熟练使用并行赋值,是写出地道 Go 代码的重要一步。










