隐式类型转换常量与变量

时间:2018-10-23 10:32:16

标签: go type-conversion

我遇到了这样的情况:我在常数中有一些整数值,然后将其乘以 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

据我所知,当表达式的所有操作数均为常量时,隐式数值类型转换有效,而当这些变量中的任何一个为常数时,则无效。

但是为什么会这样?

1 个答案:

答案 0 :(得分:4)

发生这种情况的原因是Go的无类型常量。在这两种情况下,您都没有明确指定类型。

在第一种情况下,您要定义一个无类型的常量(也可以使用const a float64 = 5来定义一个有类型的常量)。对于无类型的常量,只有在需要类型的上下文中使用类型时,才会推断出类型-即,将其与math.Pi相乘时,编译器会“猜测”您要在其中放置浮点数,以及所有工作正常。

在第二种情况下,变量当然必须具有类型,因此在声明变量时会进行类型推断,并且由于您使用了“ 5”,因此编译器将“推断” int,并将int和Go中不可能有浮点数。您可以使用例如a:=5.0var a float64 = 5将a声明为float64,则此代码也可以正常工作。

有关更多详细信息,请参见this blog post