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

将多个布尔值(从HTML表单)转换为字符串(Go),go,Go,我知道标题很糟糕,但不知道该怎么问这个问题。。我有一个HTML表单,带有返回多个值的select输入,例如: <select name="rights" multiple> <option value="create">create</option> <option value="view">view</option> <option value="edit">edit</option> <

我知道标题很糟糕,但不知道该怎么问这个问题。。我有一个HTML表单,带有返回多个值的select输入,例如:

<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>
所以我可以打电话:

err := r.ParseForm()
// err check
rights := r.Form["rights"]
log.Println(formContains(rights, "create"))
我想做的是检查表单包含哪些值,然后返回一个字符串,例如,如果表单包含权限“创建”和“删除”,那么它应该返回: “1001”,如果它包含“查看”、“编辑”和“删除”权限,则应返回“0111”


我可以用很多if/else或switch语句来实现期望的结果,但我知道一定有更聪明的方法。。我考虑过创建一个数组的可能性,该数组的最终外观如下:[0][1][0][1](如果权限为“查看”和“删除”),然后将该数组转换为字符串。。但到目前为止还没有成功。

我认为你应该研究一下操作主题。无需保留数组,您的四个操作可以表示为整数:

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 
}
请参见我的完整示例:


我认为你应该研究一下操作主题。无需保留数组,您的四个操作可以表示为整数:

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 
}
请参见我的完整示例:

也许像

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)
键:=[]字符串{“创建”、“查看”、“编辑”、“删除”}
b:=0
对于idx,键:=范围键{
如果len(r.Form[key])!=0{
b+=1可能类似于

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)
键:=[]字符串{“创建”、“查看”、“编辑”、“删除”}
b:=0
对于idx,键:=范围键{
如果len(r.Form[key])!=0{

b+=1是的,按位逻辑FTW:)是的,按位逻辑FTW:)我想你的答案完全符合我的要求,我愿意接受,但我知道我最终会使用Pavel的方法来实现,所以很遗憾,我可以对它投赞成票。我想你的答案完全符合我的要求,我愿意接受,但我知道我最终会使用Pavel的方法来实现r我的实现,所以我可以很遗憾地投票表决它。。