2017-02-24 7 views
0

私は、アクセス権のリストを持っている:構造体フィールドをリストからの値にするにはどうすればいいですか?

const (
    Everyone = 0 
    Owner = 1 
    Administrator = 2 
) 

とルートを表す構造体:

type Route struct { 
    Name  string 
    Method  string 
    Pattern  string 
    HandlerFunc http.HandlerFunc 
    AccessLevel uint64 
} 

私はRouteAccessLevelフィールド値を上から一つだけ、それらのconstのこと、構造体を制限するにはどうすればよいですか?

+1

[Golang:定数型を作成し、Typeの値を制限する]の複製(http://stackoverflow.com/questions/37385007/golang-creating-a-constant-type-and-restricting -the-types-values/37386119#37386119)。 – icza

答えて

0

できません。 Goはenumをサポートしていません。しかし、あなたはそれに近づくことができます。ちょうどあなたのアクセスレベル用に別の種類紹介:

type AccessLevel uint64 

をしてconstsは型でも行います。

const (
    Everyone  AccessLevel = 0 
    Owner      = 1 
    Administrator    = 2 
) 

は、その型のものであるとフィールドを定義します。

type Route struct { 
    // ... 
    AccessLevel AccessLevel 
} 

これで、これらのconstを割り当てることができますが、 "通常の" uint64は割り当てられません。

なお、uint64AccessLevelに変換すると、AccessLevel(1234)と入力することができます。

+0

これはOPが話していた制限を課すとは思わない。 AccessLevelタイプがより大きいドメインであるAccessLevelタイプの定数にします。 – hashcode55

+0

@ hashcode55私は知っていますが、OPが望む制限は不可能です。 – Danilo

1

このタイプの制限を課す唯一の方法は、フィールドをエクスポートしないで、どのセッターメソッドでもチェックすることです。 /可能関連

type Route struct { 
    Name  string 
    Method  string 
    Pattern  string 
    HandlerFunc http.HandlerFunc 
    accessLevel uint64 
} 

// AccessLevel getter method 
func (r Route) AccessLevel() uint64 { 
    return r.accessLevel 
} 

// SetAccessLevel setter method 
func (r Route) SetAccessLevel(value uint64) error { 
    if value < 0 || value > 2 { 
     return errors.New("AccessLevel must be between 0 and 2, inclusive") 
    } 
    r.accessLevel = value 
    return nil 
} 
+1

@Danilioプライバシーの細かさはゴランのパッケージです。 OOP言語では、同じクラスの関数がプライベートメンバーにアクセスできます。スコープはパッケージ –

+0

です。 'accessLevel'フィールドは、同じパッケージ内のどのコードでも直接設定できます。私たちの答えの両方は、opの質問に答えることができません "[...]フィールド値[...]を上のconstのどれかに制限するにはどうすればいいですか?本当の答えはあなたができないことです。 constをとることができるタイプのフィールドは、他の値をとることができます。 – Danilo

関連する問題