在声明两个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
所以最后,我的问题是:
从类型化常量表达式中声明一个非类型化常量是不可能的吗?
答案 0 :(得分:1)
我不清楚这里的实际问题是什么。 IDE的建议似乎是说z
的类型可以从y
的类型推断出来,因此可以省略显式声明。看来是正确的。
尽管y
的声明仍未键入,所以看来有什么问题呢?常量的推断类型受其组成部分的影响-不能忽略它们,否则会出现类型不匹配的情况。您可能有兴趣阅读how type inference is typically implemented; Go不一定是这种情况,但总体上应该是一个不错的介绍,以帮助您了解此处的基本机制。
请注意,您也可以省略x
的类型,并且最终结果类型将为float64
,因此无需类型就可以推断出所有结果。