鉴于此代码:type Philosopher intconst ( Epictetus Philosopher = iota Seneca)func Quote(who Philosopher) string { fmt.Println("t: ", reflect.TypeOf(who)) switch who { case Epictetus: return "First say to yourself what you would be; and do what you have to do" case Seneca: return "If a man knows not to which port he sails, No wind is favorable" } return "nothing"}调用Quote(5)将打印Foo.Philosopher为 5 的类型。为什么类型检查器没有抱怨,因为这是类型安全枚举应该做的事情,即限制值的范围?
3 回答
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
这些不是您认为的枚举。TypePhilosopher或多或少是 int 的别名。或多或少,因为它是一个根本不同的类型,它可以定义自己的方法。
它的重点是以程序员清楚的方式提供常量的语义分组。此外,您可以在编译时获得 Go 类型检查器的好处。但只是到了传递给 a 的值func(Philosopher)不能被隐式解释的程度。将文字5作为参数传递有效,因为像 Go 中那样的常量本质上是无类型的。这行不通;
n := 5
Quote(n) // Compile error -> int is not Philosopher
原因被n定义为int。typeint和之间不存在隐式转换Philosopher。但是,这将起作用:
n := 5
Quote(Philosopher(n))
因为类型转换是有效的。Go 不关心是否5是一个有效的和预定义的Philosopher常量。
RISEBY
TA贡献1856条经验 获得超5个赞
除了 int 隐含的值外,Go 不对有效值做出任何保证。使用iota只是为了方便定义一系列常量;它没有说明有效值。
5 是一个有效的整数,因此是一个有效的哲学家。您还可以创建 const Plato = Philosopher(5)。
- 3 回答
- 0 关注
- 241 浏览
添加回答
举报
0/150
提交
取消