問題內容
據我了解,go 是靜態類型的,通常不進行隱式類型轉換。因此,沒有顯式類型聲明的常量是根據首次使用時的要求而定的。
因此,在下面的代碼片段中,我希望 n 是 float64,因為這就是 math.sin 所期望的。但是當打印出反射類型時,我看到了 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"
}
登錄后復制
這里到底發生了什么? n 實際上有隱式 int 類型嗎?或者反射不會顯示這樣的實際類型情況?我不認為 math.sin 正在對其參數進行類型轉換,因為如果我指定顯式類型,編譯器會拋出錯誤。
正確答案
[無類型常量的類型]根據首次使用時的要求而定。
這就是你理解錯誤的地方。每種用途都會獨立選擇一種類型。
math.Sin 需要 float64 參數,因此編譯器必須在此處選擇 float64。
reflect.TypeOf 采用 interface{} 參數,因此編譯器可以自由選擇任何數字類型(因為它們都實現空接口)。這里選擇了默認的整數類型:int。






