微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

鉴于此代码
type Philosopher int
const (
    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的类型.
为什么类型检查器没有抱怨,因为类型安全枚举应该做什么,即限制值的范围?

这些都不是你想到的枚举.类型Philosopher或多或少是int的别名.或多或少,因为它是一个基本上不同的类型,可以定义自己的方法.

它的关键是以程序员清楚的方式提供常量的语义分组.另外,在编译期间可以获得Go的类型检查器的好处.但只有在传递给func(Philosopher)的值不能被隐含地解释为这样的程度.传递文字5作为参数有效,因为Go中的常量本身就是无类型的.这不起作用;

n := 5
Quote(n)  // Compile error -> int is not Philosopher

原因是n被定义为int.类型int和Philosopher之间不存在隐式转换.但是,这将有效:

n := 5
Quote(Philosopher(n))

因为类型转换是有效的. Go不关心5是否是有效且预定义的哲学常量.

原文地址:https://www.jb51.cc/go/186869.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐