問題內(nèi)容
據(jù)我了解,go 是靜態(tài)類型的,通常不進(jìn)行隱式類型轉(zhuǎn)換。因此,沒有顯式類型聲明的常量是根據(jù)首次使用時的要求而定的。
因此,在下面的代碼片段中,我希望 n
是 float64
,因?yàn)檫@就是 math.sin
所期望的。但是當(dāng)打印出反射類型時,我看到了 int
。
package main import ( "fmt" "math" "reflect" ) func main() { const n = 5000 // No explict type // fmt.Println(reflect.TypeOf(n)) // this would print "int" fmt.Println(math.Sin(n)) // math.Sin expects a float64 fmt.Println(reflect.TypeOf(n)) // print "int" }
登錄后復(fù)制
這里到底發(fā)生了什么? n
實(shí)際上有隱式 int 類型嗎?或者反射不會顯示這樣的實(shí)際類型情況?我不認(rèn)為 math.sin
正在對其參數(shù)進(jìn)行類型轉(zhuǎn)換,因?yàn)槿绻抑付@式類型,編譯器會拋出錯誤。
正確答案
[無類型常量的類型]根據(jù)首次使用時的要求而定。
這就是你理解錯誤的地方。每種用途都會獨(dú)立選擇一種類型。
math.Sin 需要 float64 參數(shù),因此編譯器必須在此處選擇 float64。
reflect.TypeOf 采用 interface{} 參數(shù),因此編譯器可以自由選擇任何數(shù)字類型(因?yàn)樗鼈兌紝?shí)現(xiàn)空接口)。這里選擇了默認(rèn)的整數(shù)類型:int。