为什么这段代码不能编译?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
梦里花落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常量。这就是一切。
- 3 回答
- 0 关注
- 253 浏览
添加回答
举报
0/150
提交
取消