我遇到了这样的情况:我在常数中有一些整数值,然后将其乘以 math.Pi 常数,如下所示:
func main() {
const a = 5
fmt.Printf("%v", a*math.Pi)
}
执行后会得到以下结果:
15.707963267948966
但是,当我将常量更改为变量(variable a
)时,如下所示:
func main() {
a := 5
fmt.Printf("%v", a*math.Pi)
}
在编译时会出现以下错误:
constant 3.14159 truncated to integer
据我所知,当表达式的所有操作数均为常量时,隐式数值类型转换有效,而当这些变量中的任何一个为常数时,则无效。
但是为什么会这样?
答案 0 :(得分:4)
发生这种情况的原因是Go的无类型常量。在这两种情况下,您都没有明确指定类型。
在第一种情况下,您要定义一个无类型的常量(也可以使用const a float64 = 5
来定义一个有类型的常量)。对于无类型的常量,只有在需要类型的上下文中使用类型时,才会推断出类型-即,将其与math.Pi相乘时,编译器会“猜测”您要在其中放置浮点数,以及所有工作正常。
在第二种情况下,变量当然必须具有类型,因此在声明变量时会进行类型推断,并且由于您使用了“ 5”,因此编译器将“推断” int,并将int和Go中不可能有浮点数。您可以使用例如a:=5.0
或var a float64 = 5
将a声明为float64,则此代码也可以正常工作。
有关更多详细信息,请参见this blog post。