【问题标题】:Go - math.MaxInt64 and Type Inference ErrorGo - math.MaxInt64 和类型推断错误
【发布时间】:2015-06-01 07:50:10
【问题描述】:

我一直在研究涉及包的元编程,每当出现math.MaxInt64math.MaxUint64 时,我都会遇到错误constant 9223372036854775807 overflows int

我把它分为两种情况:

有效

var a int64 = math.MaxInt64
b := interface{}(int64(math.MaxInt64))

无效

a := math.MaxInt64
b := interface{}(math.MaxInt64)

https://play.golang.org/p/U1QDmFbV29

Go 似乎没有进行正确的类型推断。

这是一个错误还是预期的行为?如果期望,有人知道为什么吗?

【问题讨论】:

  • 这可能是因为您在 32 位环境中运行 Go。在 64 位机器上,这两个表达式都可以。
  • 不是这样的。我的操作系统和 Go 都是 64 位的。
  • 你确定吗? go env GOARCH 输出什么?
  • @TristanRice @JimB 至少操场有 32 位整数 - GOARCH 那里打印 amd64p32 AFAIK 表示整数是 32 位宽。
  • 按预期在我的机器上工作 'Darwin Kernel Version 13.4.0: Sun Aug 17 19:50:11 PDT 2014;根:xnu-2422.115.4~1/RELEASE_X86_64'

标签: types go inference


【解决方案1】:

math.MaxInt64 是一个Untyped Constant。数字常量表示任意精度的值并且不会溢出。当你把它赋值给一个变量时,它需要转换为数值类型,如果没有指定,则默认使用int

由于 Go 中的 int 类型代表您的架构的本机大小,这将在具有 32 位 ints 的系统上溢出。

【讨论】:

  • 谢谢!这就解释了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多