
go 支持类似 python 的多重赋值语法(如 a, b = b, a),无需临时变量即可安全、高效地交换同类型变量的值,这是 go 的原生特性且被官方推荐为惯用写法。
go 支持类似 python 的多重赋值语法(如 a, b = b, a),无需临时变量即可安全、高效地交换同类型变量的值,这是 go 的原生特性且被官方推荐为惯用写法。
在 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 等),也适用于结构体、指针、切片等复合类型——只要左右两侧变量数量、顺序和类型兼容即可:
type Person struct {
Name string
Age int
}
p1 := Person{"Alice", 30}
p2 := Person{"Bob", 25}
p1, p2 = p2, p1 // 合法且高效
⚠️ 注意事项:
- 类型必须一致或可赋值:a, b = b, a 要求 b 可赋给 a,且 a 可赋给 b;若类型不同(如 int 和 string),编译器会报错。
- 不依赖求值顺序:Go 规范明确保证右侧表达式先全部求值,再统一赋给左侧变量,因此 a, b = b, a 不会出现“覆盖丢失”问题(区别于 a = b; b = a 这类顺序赋值)。
- 不可用于非变量目标:不能对函数返回值、常量或字面量进行左值交换(如 f(), g() = g(), f() 是非法的)。
总结:Go 的并行赋值是语言级支持的、零开销的交换机制,比引入临时变量更简洁、更符合 Go 的惯用风格(idiomatic Go)。在实际开发中,应优先使用 a, b = b, a,它既是语法糖,也是性能与可读性的双重优选。











