2014-09-27 59 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

相关问题