将多个bool值(从HTML表单)转换为字符串(Go)

时间:2017-04-05 15:12:06

标签: 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"))

我想要做的是检查表单包含哪些值,然后返回一个字符串,例如,如果表单包含权限“create”和“delete”,那么它应该返回: “1001”,如果它包含权限“视图”,“编辑”和“删除”,那么它应该返回“0111”。

我可以使用很多if / else或switch语句来实现所需的结果,但我知道必须有一个更聪明的方法..我认为创建一个最终看起来像这样的数组的可能性: [0] [1] [0] [1](如果权限是“查看”和“删除”),然后将数组转换为字符串..但到目前为止它没有成功..

2 个答案:

答案 0 :(得分:4)

我认为您应该查看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)

为了获得所有选定的权限,您可以使用bitwise OR操作:

rights := 0
rights |= 2
rights |= 4
// rights is 6 now, i.e. view and edit

然后,当您需要检查是否启用了特定权限时,您可以使用bitwise AND操作:

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 
}

答案 1 :(得分:2)

也许像

keys := []string{"create", "view", "edit", "delete"}
b := 0
for idx, key := range keys {
    if len(r.Form[key]) != 0 {
        b += 1 << uint(idx)
    }
}
fmt.Printf("%04b", b)

使用s := fmt.Sprintf("%04b", b)存储&#34; binari权限字符串&#34;到一个字符串变量。