
本文介绍在 Go 中将 HTML 多选表单(如权限选择框)的选中项映射为紧凑的二进制字符串(如 "0111"),利用位运算替代冗长的 if/else,实现高性能、可扩展的权限编码方案。
本文介绍在 go 中将 html 多选表单(如权限选择框)的选中项映射为紧凑的二进制字符串(如 `"0111"`),利用位运算替代冗长的 if/else,实现高性能、可扩展的权限编码方案。
在 Web 开发中,常需将用户通过 <select multiple></select> 选择的权限(如 create、view、edit、delete)转换为结构化标识——例如生成固定长度的二进制字符串 "1001" 表示仅启用 create 和 delete。若采用传统条件判断链,不仅代码臃肿、难以维护,还无法自然支持权限组合校验与扩展。更优雅的解法是基于位运算的权限编码模型。
该模型将每个权限赋予唯一且互斥的 2 的幂次整数值:
const (
RightCreate = 1 << 0 // 1 → 0001
RightView = 1 << 1 // 2 → 0010
RightEdit = 1 << 2 // 4 → 0100
RightDelete = 1 << 3 // 8 → 1000
)这样,任意权限组合均可通过按位或(|=)聚合为一个整数:
- 选中
view+edit→2 | 4 = 6(二进制0110) - 选中
create+delete→1 | 8 = 9(二进制1001)
接下来,只需将整数转为指定长度的二进制字符串即可。以下为完整处理函数:
立即学习“前端免费学习笔记(深入)”;
import "fmt"
func rightsToBinaryString(rights int, totalBits int) string {
if totalBits <= 0 {
return ""
}
var bits []byte
for i := totalBits - 1; i >= 0; i-- {
if rights&(1<<i) != 0 {
bits = append(bits, '1')
} else {
bits = append(bits, '0')
}
}
return string(bits)
}
// 在 HTTP handler 中使用示例:
func handleForm(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
formRights := r.Form["rights"] // 如 ["view", "edit"]
var encoded int
for _, right := range formRights {
switch right {
case "create": encoded |= RightCreate
case "view": encoded |= RightView
case "edit": encoded |= RightEdit
case "delete": encoded |= RightDelete
}
}
binaryStr := rightsToBinaryString(encoded, 4) // 固定4位:create/view/edit/delete
fmt.Printf("权限编码: %s\n", binaryStr) // 输出 "0110"
}⚠️ 注意事项:
- 权限常量必须严格为
1 形式,确保无重叠位; -
rightsToBinaryString中totalBits应与权限总数一致(本例为 4),避免高位缺失; - 若需反向解析(从
"0110"还原为["view","edit"]),可遍历每一位并用&检查对应权限位; - 此方案天然支持权限交集(
a & b)、并集(a | b)、差集(a &^ b)等高级操作,远超字符串拼接能力。
该设计兼顾简洁性与工程健壮性,是处理布尔型多选项映射的经典范式。



















