组合无类型和类型常量时的类型推断

时间:2019-05-04 17:07:35

标签: go types const

在声明两个const变量时(一个为类型,一个为非类型),并打印出第二个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被定义为将未类型的浮点常数除以类型化的浮点常数,因此可以推断出类型。
根据“按示例执行”(https://gobyexample.com/constants),除非明确提供,否则常量永远不会具有类型。但是,根据Go官方博客文档,未类型化的常量 do 具有可以推断出的隐藏类型,但是让该常量保持未类型化,直到需要一个类型为止。

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

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

所以最后,我的问题是:
从类型化常量表达式中声明一个非类型化常量是不可能的吗?

1 个答案:

答案 0 :(得分:1)

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

尽管y的声明仍未键入,所以看来有什么问题呢?常量的推断类型受其组成部分的影响-不能忽略它们,否则会出现类型不匹配的情况。您可能有兴趣阅读how type inference is typically implemented; Go不一定是这种情况,但总体上应该是一个不错的介绍,以帮助您了解此处的基本机制。


请注意,您也可以省略x的类型,并且最终结果类型将为float64,因此无需类型就可以推断出所有结果。