2017-04-05 36 views
1

我知道標題是非常糟糕的,但不知道怎麼問這個問題..我有一個HTML形式的選擇輸入返回多個值,如:打開(包括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](在情況下,權利是「查看」和「刪除」),然後將數組轉換爲字符串..但到目前爲止它已經不成功..

回答

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 
} 
+0

是的,按位邏輯FTW :) –

+0

哇,這真的很棒..非常感謝! – fisker

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)存儲 「binari權利串」 成一個字符串變量。

+0

我認爲你的回答完全符合我的要求,並且我想接受它,但是我知道我最終會使用Pavel的方法來實現我的實現,所以可能會傷心地接受它。 – fisker