为了账号安全,请及时绑定邮箱和手机立即绑定

golang 中原始值的 typedef 是否等效?

golang 中原始值的 typedef 是否等效?

Go
三国纷争 2021-07-29 15:16:10
鉴于此代码: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常量。


查看完整回答
反对 回复 2021-08-02
?
BIG阳

TA贡献1859条经验 获得超6个赞

较短的答案应该是

无类型常量采用其上下文所需的类型。


查看完整回答
反对 回复 2021-08-02
?
RISEBY

TA贡献1856条经验 获得超5个赞

除了 int 隐含的值外,Go 不对有效值做出任何保证。使用iota只是为了方便定义一系列常量;它没有说明有效值。

5 是一个有效的整数,因此是一个有效的哲学家。您还可以创建 const Plato = Philosopher(5)。


查看完整回答
反对 回复 2021-08-02
  • 3 回答
  • 0 关注
  • 241 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信