簡體   English   中英

Golang 類型斷言數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM