gpt4 book ai didi

types - 常数 1 被截断为整数?

转载 作者:IT王子 更新时间:2023-10-29 00:48:55 26 4
gpt4 key购买 nike

为什么这段代码无法编译?

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在这里是一个float64,但是它可以传递给f

最佳答案

go 团队制作了一个 blog post about this最近我建议你阅读。

来自介绍

Go is a statically typed language that does not permit operations that mix numeric types. You can't add a float64 to an int, or even an int32 to an int. Yet it is legal to write 1e6*time.Second or math.Exp(1) or even 1<<('\t'+2.0). In Go, constants, unlike variables, behave pretty much like regular numbers. This post explains why that is and what it means.

TLDR - 常量在 Go 中是无类型的。他们的类型只是在最后一刻才具体化。

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

func f(int) {}

然后

f(1) // ok
f(1.000) // OK
f(1.0E6) // OK
f(1.0001) // BAD

关于types - 常数 1 被截断为整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25584329/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com