隐式类型转换常量与变量

I have faced a situation where I have some integer value in a constant and multiplying it with math.Pi constant as below:

func main() {
    const a = 5
    fmt.Printf("%v", a*math.Pi)
}

On execution it gives following result:

15.707963267948966

But, when I change the constant to variable (variable a) as below:

func main() {
    a := 5
    fmt.Printf("%v", a*math.Pi)
}

On compilation it gives the following error:

constant 3.14159 truncated to integer

As far as I understand implicit numeric type conversion is working when all operands of expression are constants, but not working when any of these a variable.

But why is this happening?

It's happening because of Go's untyped constants. In both cases, you are not explicitly specifying a type.

In the first case, you are defining an untyped constant (you could also define a typed constant by using const a float64 = 5). For an untyped constant, a type will only be inferred when it’s used in a context that requires a type – i.e. when you are multiplying it with math.Pi, the compiler will "guess" that you want to have a float there, and everything works fine.

In the second case, a variable of course has to have a type, so the type inference takes place when declaring the variable, and since you used "5", the compiler will "infer" int, and multiplying an int and a float is not possible in Go. You could use e.g. a:=5.0 or var a float64 = 5 to declare a as a float64, then this code would work as well.

See this blog post for more details.