确定var是否是自定义类型
问题描述:
如何确定传递给我的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型定义
一个枚举
答
短版?您无法创建限制类型的枚举。
朗版本,有几个选项:
在“类型”定义的验证功能:
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
}
答
有你喜欢的类型实现一个没有出口的接口
type Name string
type Private interface{
private()
}
func (n Name) private() {}
func MyFunc(name1, name2 Private) (*Person, error) {
//bunch of stuff
}
最后这是正确的做法,我需要的所有值都是常量,所以我应用了最后一条建议,其他答案没有通过goLint,也没有明确解决您最后一条建议的地方,谢谢 – Eefret 2014-09-29 15:17:56