在 Go 语言中,| 是按位或(bitwise OR)运算符,常用于组合以 2 的幂定义的常量,形成可同时启用多个选项的位掩码(bitmask),广泛应用于系统服务、权限控制等场景。
在 go 语言中,`|` 是按位或(bitwise or)运算符,常用于组合以 2 的幂定义的常量,形成可同时启用多个选项的位掩码(bitmask),广泛应用于系统服务、权限控制等场景。
Go 语言中的 | 符号是按位或(bitwise inclusive OR)运算符,它对两个整数的操作数执行逐位逻辑或运算:只要对应位中有一个为 1,结果该位即为 1;仅当两位均为 0 时,结果才为 0。这一特性使其成为实现位标志(bit flags) 的核心工具——即用单个整数变量高效地表示多个布尔选项的组合。
为什么用 |?关键在于“互斥的二进制位”
位标志的前提是:每个选项常量必须是2 的幂次方(如 1, 2, 4, 8, 16…),其二进制表示中有且仅有一个 1,其余为 0。例如:
const (
AcceptStop = 1 <p>此时,使用 | 组合即可无冲突地“叠加”多个标志:</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill6460" title="Golang Naming"><img
src="https://img.php.cn/upload/skill/000/000/081/179094616043400.jpg" alt="Golang Naming" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill6460" title="Golang Naming" class="overflowclass">Golang Naming</a>
<p class="overflowclass">Go(Golang)命名规范 — 包括包、构造函数、结构体、接口、常量、枚举、错误、布尔值、接收器、getter/setter、函数等。</p>
</div>
<a rel="nofollow" href="/xiazai/skill6460" title="Golang Naming" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><pre class="brush:php;toolbar:false;">const cmdsAccepted = AcceptStop | AcceptShutdown | AcceptPauseAndContinue
// 计算过程(以 4 位二进制示意):
// 0001 (Stop) → 1
// 0100 (Shutdown) → 4
// 0010 (Pause/Continue) → 2
// -------------------------
// 0111 → 7 (即 1 | 4 | 2 = 7)结果 7 的二进制 0111 清晰表明:第 0、1、2 位被置为 1,对应 Stop、PauseAndContinue、Shutdown 三个选项全部启用,彼此互不干扰。
实际应用:Windows 服务控制命令
在 golang.org/x/sys/windows/svc 包中,svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue 正是此模式的典型用例。它告诉 Windows 服务管理器:该服务同时接受停止、关机和暂停/继续三类控制指令。底层通过一个 uint32 类型的 dwControlsAccepted 字段传递给系统 API,既节省内存,又支持 O(1) 位检测(例如用 & 运算判断是否接受某命令)。
注意事项与最佳实践
- ✅ 务必确保标志常量互不重叠:推荐使用 1
- ✅ 检查是否启用某标志:用按位与 &,如 if cmdsAccepted&svc.AcceptStop != 0 { ... };
- ❌ 避免对非幂次常量使用 | 组合(如 3 | 5 会产生不可预测的语义);
- ? Go 标准库中类似模式常见于 os.OpenFile 的 flag 参数(如 os.O_RDONLY | os.O_CREATE)、syscall 标志等。
掌握 | 在位标志中的用法,不仅能读懂系统级 Go 代码,更是编写高性能、可扩展配置接口的重要基础。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










