常量 1 被截断为整数?

为什么这段代码不能编译?


package main

const a = 1.000001

const base = 0

const b = a+base

func 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 main

import "fmt"

const a = 1.000001

const b = a-0.000001

func 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.000001

float64 1

? b是一个float64here,但它可以传递给f.


回首忆惘然
浏览 254回答 3
3回答

芜湖不芜

Go 团队最近发表了一篇关于此的博客文章,我建议您阅读。从介绍Go 是一种静态类型语言,不允许混合数字类型的操作。您不能将 float64 添加到 int,甚至不能将 int32 添加到 int。然而,写 1e6*time.Second 或 math.Exp(1) 甚至 1<<('\t'+2.0) 都是合法的。在 Go 中,常量与变量不同,其行为与常规数字非常相似。这篇文章解释了为什么会这样以及它意味着什么。TLDR - Go 中的常量是无类型的。它们的类型只在最后一刻才结晶。这解释了你上面的问题。给定的func f(int) {}然后f(1) // okf(1.000) // OKf(1.0E6) // OKf(1.0001) // BAD

梦里花落0921

你的第一个程序可以这样重写:package mainfunc main() {&nbsp; &nbsp; f(1.000001)}func f(int) {}这显然不是将整数值传递给整数函数。您的第二个程序可以类似地重写为:package mainimport "fmt"func main() {&nbsp; &nbsp; fmt.Printf("%T %v\n",1.000001,1.000001)&nbsp; &nbsp; fmt.Printf("%T %v\n",1,1)&nbsp; &nbsp; f(1)}func f(int) {}这看起来不错。我所做的只是手动替换a和b常量。这就是一切。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go