2017-02-24 66 views
0

我的訪問權限列表:如何使一個struct字段成爲列表中的值?

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

而且一個結構較途徑:

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

我怎麼能限制Route結構的AccessLevel字段的值只能從上面這些常量之一?

+1

相關/可能重複[Golang:創建一個恆定類型和制約型的值(http://stackoverflow.com/questions/37385007/golang-creating-a-constant-type-and-restricting -the-類型值/ 37386119#37386119)。 – icza

回答

0

你不能。 Go不支持枚舉。但是,你可以接近它。剛剛推出一個單獨的類型,請訪問級別:

type AccessLevel uint64 

,使consts是類型:

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

然後定義字段是這種類型的:

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

現在您可以分配這些常量,但不是「常規」uint64

需要注意的是,您仍然可以通過AccessLevel(1234)鍵入將uint64轉換爲AccessLevel

+0

我不認爲這會強加OP所說的限制。它使常量成爲AccessLevel類型,其中AccessLevel類型是更大的域。 – hashcode55

+0

@ hashcode55我知道,但OP想要的限制是不可能的。 – Danilo

1

實施此類限制的唯一方法是不導出該字段,並在任何setter方法中執行檢查。的

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隱私的粒度是golang中的包。在OOP語言中可能是同一類的功能可以在這裏訪問私有成員,因此範圍是包 –

+0

'accessLevel'字段仍然可以由相同包中的任何代碼直接設置。我們的兩個答案都未能回答「我如何限制字段值只能是上面那些常量之一?」真正的答案是:你不能。任何一個能夠接受const的類型的字段都可以採用其他值。 – Danilo

相關問題