登录
首页 >  Golang >  Go问答

自动推断混合类型化和非类型化常量的类型

来源:stackoverflow

时间:2024-03-26 10:45:39 175浏览 收藏

在 Go 语言中,无类型常量具有可推断的隐藏类型,但通常保持非类型化。然而,当使用类型化常量表达式声明非类型化常量时,IDE 检查器建议省略类型,这引发了疑问:是否可以从类型化常量表达式声明非类型化常量?本文探究了这种情况下类型的推断机制,并讨论了推断类型与常量无类型性质之间的关系。

问题内容

当声明两个 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

最后,我的问题是:

是否不可能从类型化常量表达式中声明非类型化常量?


解决方案


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

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

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

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>