
“|=”是go中的位或赋值运算符,用于对变量执行按位或(or)运算后将结果原地赋值给该变量,等价于 `a = a | b`,常用于标志位(bitmask)的组合与累积。
在Go语言中,|= 是一个复合赋值运算符,属于位运算家族,其语义为:
x |= y // 等价于 x = x | y
其中 | 是按位或(bitwise OR)运算符:对两个操作数的每一位执行逻辑或操作——只要对应位中至少有一个为 1,结果位即为 1;否则为 0。
在你提供的代码片段中:
func getPageInfoMode(r *http.Request) (mode PageInfoMode) {
for _, k := range strings.Split(r.FormValue("m"), ",") {
if m, found := modeNames[strings.TrimSpace(k)]; found {
mode |= m // 关键行:累积多个模式标志
}
}
return
}PageInfoMode 很可能是一个整数类型(如 uint8 或 int),而 modeNames 是一个将字符串映射到唯一比特位的字典,例如:
立即学习“go语言免费学习笔记(深入)”;
var modeNames = map[string]PageInfoMode{
"summary": 1 << 0, // 0001
"detail": 1 << 1, // 0010
"chart": 1 << 2, // 0100
"export": 1 << 3, // 1000
}此时,若请求参数 m="summary,detail",则循环中依次执行:
- mode |= 0001 → mode 变为 0001
- mode |= 0010 → mode 变为 0011(即同时启用 summary 和 detail)
✅ 这种设计高效、内存友好,且天然支持多选标志的并集运算,是系统配置、权限控制、渲染选项等场景的经典实践。
⚠️ 注意事项:
- |= 要求左右操作数类型必须严格一致(或可隐式转换),且必须是整数类型(int, uint, byte, rune 等);
- 不可用于浮点数、字符串或结构体;
- 若 mode 初始值为 0(零值),|= 可安全累积;但若初始值含意外位,可能导致逻辑错误——建议显式初始化(如 mode := PageInfoMode(0));
- 与 += 等算术复合运算符不同,|= 不改变数值大小关系,仅影响位模式,因此不可用于数学累加。
总结:|= 是 Go 中实现位标志(bitmask)组合的核心工具,简洁、高效、语义明确。熟练掌握它,有助于编写更地道、高性能的系统级与配置类代码。









