了解使用Go类型推断的常量的溢出

时间:2019-01-17 08:50:45

标签: go overflow type-inference

在TourOfGo const示例中,他们写道

  

无类型的常量采用其上下文所需的类型

但是以下程序引发了溢出:

package main

import "fmt"

const  Big  = 1 << 100 // no overflow here 
// var  Big  = 1 << 100  // overflow here 

func main() {
    fmt.Printf("big = %T",Big) // causes overflow error here
}

是否只有在将const转换为var时才发生溢出?

1 个答案:

答案 0 :(得分:1)

只要文字只是一个常量(未分配到任何地方),就不必具体化,因此没有错误。编译器等待您实际在某处使用它。考虑一下:

package main

import "fmt"

const  Big  = 1 << 100 // no overflow here 
    var f float64
    f = Big
    fmt.Println(f)
}

这将成功运行并打印出2 ^ 100的合理近似值(在浮点数的精度限制内)。但是,如果尝试将其分配给变量,则将其推断为int(毕竟,文字是整数),并且在尝试打印其类型时也是如此。