2014-09-27 60 views
3

如何確定傳遞給我的Func的var實際上是我想要的類型?確定var是否是自定義類型

我有一個自定義類型

type Name string 

和一堆型

const Fred Name = "fred" 

的常量和我有一個FUNC,我需要禁止其他任何其他類型的輸入比我定製類型例如:

func MyFunc(name1 Name, name2 Name) (*Person, error) { 
//bunch of stuff 
} 

我如何檢查我的func裏面name1和name2不是字符串傳遞給func但僅僅const的,我已經在我的類型前定義:

p, err := MyFunc(Fred,Albert) //What i want 
p, err := MyFunc("fred","albert") //What i dont want to happen 

如果不能回答我的問題,我怎麼能做出這樣的Golang一個類型,這意味着什麼,並限制其他脂肪酶使用I型定義

一個枚舉

回答

1

短版?您無法創建限制類型的枚舉。

朗版本,有幾個選項:

在「類型」定義的驗證功能:

func (n Name) valid() bool { //private method 
    switch n { 
    case Mal, Kaylee: //all the valid constants 
     return true 
    } 
    return false 
} 

然而,這並不使用Name("fred").valid()阻止別人喜歡@peterSO指出。

使用結構與它的私有成員,但是它們不是「常量」每本身,外部包可以將它們重新分配到無效值:

type Name struct { 
    n string 
} 

var (
    invalid = Name{} 
    Mal  = Name{"mal"} 
    Kaylee = Name{"kaylee"} 
) 

func MyFunc(name1 Name, name2 Name) error { 
    if name1 == invalid || name2 == invalid { 
     return errors.New("invalid names") 
    } 
    return nil 
} 

使用數字常量和私人陣列,這是唯一的防呆版本真的,你會得到一個真正的枚舉最接近:

type Name uint8 

var names = [...]string{ 
    "Mal", 
    "Kaylee", 
} 

func (n Name) valid() bool { 
    return uint8(n) < uint8(len(names)) 
} 

func (n Name) String() string { 
    if !n.valid() { 
     return "invalid" 
    } 
    return names[n] 
} 

const (
    Mal Name = iota 
    Kaylee 
) 

func MyFunc(name1 Name, name2 Name) error { 
    if !name1.valid() || !name2.valid() { 
     return errors.New("invalid names") 
    } 
    return nil 
} 
+1

最後這是正確的做法,我需要的所有值都是常量,所以我應用了最後一條建議,其他答案沒有通過goLint,也沒有明確解決您最後一條建議的地方,謝謝 – Eefret 2014-09-29 15:17:56

4

有你喜歡的類型實現一個沒有出口的接口

type Name string 

type Private interface{ 
    private() 
} 

func (n Name) private() {} 

func MyFunc(name1, name2 Private) (*Person, error) { 
    //bunch of stuff 
} 
+0

這是一個非常聰明的想法,雖然增加了斷言接口的運行時間開銷。 +1。 – OneOfOne 2014-09-27 05:02:58

+0

@OneOfOne我想你也可以使用private()返回名稱以方便'interface private {private()Name}'。 – jmaloney 2014-09-27 05:15:44

+0

我不是100%確定,但我認爲只是傳遞接口本身需要運行時間開銷,但我可能是錯的。 – OneOfOne 2014-09-27 05:26:18

相關問題