3 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
Go 團(tuán)隊(duì)最近發(fā)表了一篇關(guān)于此的博客文章,我建議您閱讀。
從介紹
Go 是一種靜態(tài)類型語言,不允許混合數(shù)字類型的操作。您不能將 float64 添加到 int,甚至不能將 int32 添加到 int。然而,寫 1e6*time.Second 或 math.Exp(1) 甚至 1<<('\t'+2.0) 都是合法的。在 Go 中,常量與變量不同,其行為與常規(guī)數(shù)字非常相似。這篇文章解釋了為什么會這樣以及它意味著什么。
TLDR - Go 中的常量是無類型的。它們的類型只在最后一刻才結(jié)晶。
這解釋了你上面的問題。給定的
func f(int) {}
然后
f(1) // ok
f(1.000) // OK
f(1.0E6) // OK
f(1.0001) // BAD

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊
你的第一個(gè)程序可以這樣重寫:
package main
func main() {
f(1.000001)
}
func f(int) {}
這顯然不是將整數(shù)值傳遞給整數(shù)函數(shù)。
您的第二個(gè)程序可以類似地重寫為:
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) {}
這看起來不錯(cuò)。
我所做的只是手動(dòng)替換a和b常量。這就是一切。
- 3 回答
- 0 關(guān)注
- 281 瀏覽
添加回答
舉報(bào)