我正在阅读 Head First Go,我在 56 中遇到了这个:
我尝试了一下,它确实给出了一个错误:
var fl float64 = 5.5
var in int = 5
if(fl > in){
fmt.Println("vars")
}
然后我尝试了这个并且它起作用了:
if(5.5 > 5){
fmt.Println("numbers")
}
如果你不能在 go 中比较不同的类型,那么为什么你可以像第二个例子那样呢?在我看来,答案之一 - 可能是隐式转换。如果语言编写得尽可能简单明了以便于阅读,为什么它们仍留在 golang 中?它在某种程度上偏离了语言的哲学和概念。但既然他们留下了它,就意味着出于某种原因这是必要的,所以有一个应用程序。为什么 - 我还没弄清楚,我在等待你的帮助:)
恕我直言,Go 开发人员之一是 Ada 语言的忠实粉丝,该语言要求编译器为编译时计算实现几乎无限的精度。在 Go 规范中,编译器还希望计算精度不受限制:
由于这个要求,文字常量
5
不是类型的对象int
。这是数字五的抽象数学概念的表示。因此,很可能将其与字面常量进行比较5.5
,而字面常量又表达了数学抽象五点五。为了不依赖 64 位整数运算,Go 的创建者决定考虑无类型(无类型)常量。仅当在类型化表达式中使用时(例如,分配给变量或初始化结构字段),才会将潜在的无限常量减少为存储在特定类型中的对象。
https://go.dev/blog/constants