1 回答

TA貢獻1893條經(jīng)驗 獲得超10個贊
一個if語句只能與單個類型進行比較,因為它沒有像語句這樣的分支,并且您必須在這樣的語句switch中使用類型斷言if:
var i interface{}
i = 3.3 // store a float64 value in i
if f, ok := i.(float64); ok {
fmt.Print("It's a float64 value: %.2f", f)
} else {
fmt.Println("Not float64")
}
這將輸出(在Go Playground上嘗試):
It's a float64 value: 3.30
您也可以使用反射,但這里的類型斷言更有效且更慣用。作為參考,這是使用反射的樣子:
if reflect.TypeOf(i) == reflect.TypeOf(float64(0)) {
fmt.Printf("It's a float64 value: %.2f", i)
} else {
fmt.Println("Not float64")
}
輸出是一樣的。在Go Playground上試試這個。
請注意,當(dāng)我們使用類型斷言時,我們有一個f斷言類型 ( float64) 的變量,因此如果某些函數(shù)直接需要該類型的值,我們可以使用它。使用反射時,我們沒有這種類型的值,i“仍然”是 type interface{},我們可以使用它,因為fmt.Printf()它的值是interface{}。但是如果我們必須將它傳遞給需要的函數(shù)float64,我們?nèi)匀恍枰褂茫ǜ郊拥模╊愋蛿嘌裕拖裨诘谝粋€示例中一樣。
另請注意,僅當(dāng)您的輸入是接口類型時,使用類型斷言和類型切換才有意義,因為只有接口類型可能存儲不同/多個具體類型的值。
在具體類型(如您的示例中的值)上使用類型斷言或類型開關(guān)float64沒有任何意義,因為該值可能只是類型float64而沒有別的,所以語言規(guī)范首先不允許它。
- 1 回答
- 0 關(guān)注
- 113 瀏覽
添加回答
舉報