猿问

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 的类型。为什么类型检查器没有抱怨,因为这是类型安全枚举应该做的事情,即限制值的范围?


三国纷争
浏览 242回答 3
3回答

翻过高山走不出你

这些不是您认为的枚举。TypePhilosopher或多或少是 int 的别名。或多或少,因为它是一个根本不同的类型,它可以定义自己的方法。它的重点是以程序员清楚的方式提供常量的语义分组。此外,您可以在编译时获得 Go 类型检查器的好处。但只是到了传递给 a 的值func(Philosopher)不能被隐式解释的程度。将文字5作为参数传递有效,因为像 Go 中那样的常量本质上是无类型的。这行不通;n := 5Quote(n)  // Compile error -> int is not Philosopher原因被n定义为int。typeint和之间不存在隐式转换Philosopher。但是,这将起作用:n := 5Quote(Philosopher(n))因为类型转换是有效的。Go 不关心是否5是一个有效的和预定义的Philosopher常量。

BIG阳

较短的答案应该是像:无类型常量采用其上下文所需的类型。

RISEBY

除了 int 隐含的值外,Go 不对有效值做出任何保证。使用iota只是为了方便定义一系列常量;它没有说明有效值。5 是一个有效的整数,因此是一个有效的哲学家。您还可以创建 const Plato = Philosopher(5)。
随时随地看视频慕课网APP

相关分类

Go
我要回答