[英]Golang Type Assertion Arrays
據我所知,類型斷言只能在接口中使用,並且基本上檢查確定的類型是否實現了接口。
我有一些奇怪的場景:
func binder(value interface{}) {
// Does not work
valueInt, ok := value.(int)
// Works
valueInt, ok := value.(float64)
// Does not work
coordinates, ok := value.([]int)
// Does not work
coordinates, ok := value.([]float64)
}
基本上,我的value
是一個空接口,我從json.Unmarshall
。
場景一
當我傳遞一個簡單的整數時它不起作用但是如果我檢查它是否是一個浮點數它會起作用......
場景二
當我傳遞一個 int 或 floats 數組時不起作用! 正如您在調試時所看到的,我正在接收一個數組,但由於某種原因斷言不起作用。
你的問題不清楚,但似乎歸結為以下幾點:
默認情況下, json.Unmarshal
所有數字解組為 float64,因為 JSON 中的所有數字都是浮點數。 如果需要其他類型,則需要在目標類型中使用特定類型。 例子:
var x map[string]interface{}
json.Unmarshal([]byte(`{"foo":123}`), &x) // { "foo": float64(123) }
對比:
var x map[string]int64
json.Unmarshal([]byte(`{"foo":123}`), &x) // { "foo": int64(123) }
默認情況下,所有 JSON 數組都解組為[]interface{}
,因為成員可以是任何類型,包括混合類型。 如果你想要一個特定的類型,同樣,你必須是特定的:
var x interface{}
json.Unmarshal([]byte(`[1,2,3]`), &x) // []interface{}{float64(1), float64(2), float64(3)}
對比:
var x []int64
json.Unmarshal([]byte(`[1,2,3]`), &x) // []int64{1,2,3}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.