go - 将多个 bool 值(来自 HTML 表单)转换为一个字符串 (Go)

标签 go

我知道标题很糟糕,但不确定如何提出这个问题。我有一个 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/

相关文章:

http - 流式传输 HTTP 客户端需要很长时间才能收到第一个响应字节

json - 使用 2d slice 嵌套 json 解码到结构中在 golang 中不起作用

postgresql - 如何限制json可以容纳的字段数?

arrays - 删除 slice 中的元素

json - 将 []struct 与 Json 一起使用

go - 如何在 fyne 中调整输入框的大小

audio - 使 go http 客户端与非标准的 http 服务器一起工作

go - 构造日期时使用 int 作为月份

go - 错误接口(interface)的使用方法

python - 为什么 myVar = strings.Fields(scanner.Text()) 比 python 中的类似操作花费更多的时间?