我知道标题很糟糕,但不确定如何提出这个问题。我有一个 HTML 表单,其中有一个选择输入返回多个值,例如:
<select name="rights" multiple>
<option value="create">create</option>
<option value="view">view</option>
<option value="edit">edit</option>
<option value="delete">delete</option>
</select>
然后我有一个函数可以检查表单包含哪些值:
func formContains(slice []string, item string) bool {
set := make(map[string]struct{}, len(slice))
for _, s := range slice {
set[s] = struct{}{}
}
_, ok := set[item]
return ok
}
所以我可以调用:
err := r.ParseForm()
// err check
rights := r.Form["rights"]
log.Println(formContains(rights, "create"))
我想做的是检查表单包含哪些值,然后返回一个字符串,例如,如果表单包含“创建”和“删除”权限,那么它应该返回: “1001”,如果它包含“查看”、“编辑”和“删除”权限,则返回“0111”。
我可以用很多 if/else 或 switch 语句来达到预期的结果,但我知道一定有更聪明的方法。我考虑过创建一个最终看起来像这样的数组的可能性: [0] [1] [0] [1](如果权限是“查看”和“删除”),然后将数组转换为字符串..但到目前为止一直不成功..
最佳答案
我认为你应该查看 bitwise操作主题。无需保留数组,您的四个操作可以表示为整数:
create = 1 (0001 in binary representation)
view = 2 (0010 in binary representation)
edit = 4 (0100 in binary representation)
delete = 8 (1000 in binary representation)
为了获得所有选定的权限,您可以使用按位或
操作:
rights := 0
rights |= 2
rights |= 4
// rights is 6 now, i.e. view and edit
然后当你需要检查特定权限是否启用时,你可以使用按位与
操作:
func hasPermission(rights int, item int) bool {
return (rights & item) == item
}
请参阅我的完整示例:https://play.golang.org/p/UPZkqsrDS4
package main
import (
"fmt"
)
func main() {
create := 1
view := 2
edit := 4
delete := 8
rights := 0
rights |= view
rights |= edit
fmt.Println(hasPermission(rights , create))
fmt.Println(hasPermission(rights , view))
fmt.Println(hasPermission(rights , edit))
fmt.Println(hasPermission(rights , delete))
}
func hasPermission(rights int, item int) bool {
return (rights & item) == item
}
关于go - 将多个 bool 值(来自 HTML 表单)转换为一个字符串 (Go),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43235199/