doushi2047 2018-10-23 10:32
浏览 80
已采纳

隐式类型转换常量与变量

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?

  • 写回答

1条回答 默认 最新

  • duanjia4969 2018-10-23 11:52
    关注

    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.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?