【问题标题】:type inference when combining untyped and typed consts组合无类型和有类型 const 时的类型推断
【发布时间】:2019-09-22 21:24:04
【问题描述】:

当声明两个 const 变量(一个有类型,一个无类型),并打印出第二个的类型时,如:

const x float32 = 10000
const y = 1e8 / x

fmt.Printf("the type of y: %T \n", y)
// or with reflect:
fmt.Println(reflect.TypeOf(y))

它告诉我,y 的类型是 float32

这并不奇怪,因为无类型的 const 变量 y 被定义为将无类型的浮点常量除以有类型的浮点常量,因此可以推断出类型。
根据“Go by Example”(https://gobyexample.com/constants),除非明确提供,否则常量永远不会有类型。然而,根据官方 Go 博客文档,无类型常量确实具有可以推断的隐藏类型,但在需要类型之前让常量保持无类型。

我会假设,y 仍然是一个无类型的浮点常量。但是,当使用它来分配新变量时,Goland 的检查员告诉我,可以省略类型:

const z float32 = y 
//        ^^^ type can be ommitted

最后,我的问题是:
有类型的常量表达式不能声明无类型的常量吗?

【问题讨论】:

    标签: go types constants


    【解决方案1】:

    我不清楚这里的实际问题是什么。 IDE 的建议好像是说z 的类型可以从y 的类型推断出来,所以可以省略显式声明。这似乎是正确的。

    y 的声明仍然没有类型,那么似乎有什么问题?推断出的常量类型受其组成部分的影响——它们不能被忽略,否则你会得到类型不匹配。您可能有兴趣阅读how type inference is typically implemented; Go 不一定是这种情况,但总的来说应该是一个不错的介绍,以帮助您理解这里的底层机制。


    请注意,您也可以省略x 的类型,最终结果类型将为float64,因此所有这些都可以在没有类型的情况下进行推断。

    【讨论】:

    • 嗯,是的,我确实明白,所有类型都可以推断出来,但是,通过阅读 Go 的文档,我得到的印象是,显式类型化的常量和非类型化的常量实际上是有区别的。我错了吗?
    • @PaezRice:是的,有区别,如blog.golang.org/constants中所述
    • 好吧,我想我的问题是假设我的 const 会被输入,只是因为检查员的提示,在定义 z 时可以省略类型。感谢您澄清并提供这篇关于推理实施的文章。
    猜你喜欢
    • 2012-02-07
    • 2021-11-05
    • 1970-01-01
    • 2023-03-08
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    相关资源
    最近更新 更多