为了账号安全,请及时绑定邮箱和手机立即绑定

常量 1 被截断为整数?

常量 1 被截断为整数?

Go
回首忆惘然 2021-08-16 15:16:55
为什么这段代码不能编译?package mainconst a = 1.000001const base = 0const b = a+basefunc main() {    f(b)}func f(int) {}$ go run a.go# command-line-arguments./a.go:4: constant 1 truncated to integer是说 1 被截断了?或者 1 不能被截断?它在谈论哪一个?有人回答上述代码无法编译,因为b是float64. 但是为什么会这样编译:package mainimport "fmt"const a = 1.000001const b = a-0.000001func main() {    fmt.Printf("%T %v\n",a,a)    fmt.Printf("%T %v\n",b,b)    f(b)}func f(int) {}$ go run a.go float64 1.000001float64 1? b是一个float64here,但它可以传递给f.
查看完整描述

3 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

Go 团队最近发表了一篇关于此的博客文章,我建议您阅读。


从介绍


Go 是一种静态类型语言,不允许混合数字类型的操作。您不能将 float64 添加到 int,甚至不能将 int32 添加到 int。然而,写 1e6*time.Second 或 math.Exp(1) 甚至 1<<('\t'+2.0) 都是合法的。在 Go 中,常量与变量不同,其行为与常规数字非常相似。这篇文章解释了为什么会这样以及它意味着什么。


TLDR - Go 中的常量是无类型的。它们的类型只在最后一刻才结晶。


这解释了你上面的问题。给定的


func f(int) {}

然后


f(1) // ok

f(1.000) // OK

f(1.0E6) // OK

f(1.0001) // BAD


查看完整回答
反对 回复 2021-08-16
?
梦里花落0921

TA贡献1772条经验 获得超6个赞

你的第一个程序可以这样重写:


package main

func main() {

    f(1.000001)

}

func f(int) {}

这显然不是将整数值传递给整数函数。


您的第二个程序可以类似地重写为:


package main

import "fmt"

func main() {

    fmt.Printf("%T %v\n",1.000001,1.000001)

    fmt.Printf("%T %v\n",1,1)

    f(1)

}

func f(int) {}

这看起来不错。


我所做的只是手动替换a和b常量。这就是一切。


查看完整回答
反对 回复 2021-08-16
  • 3 回答
  • 0 关注
  • 253 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信