2017-12-27 13 views
-2

私が理解しているところでは、アサーションはインターフェイスでのみ使用でき、基本的には決定された型がインターフェイスを実装しているかどうかをチェックします。Golang型アサーションアレイ

私はいくつかの奇妙なシナリオを持っています:

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から取得しています。

シナリオ1

私は単純な整数を渡すとき、それは動作しませんが、私はそれが動作フロート...

シナリオがあるか確認してください、私は合格2

intまたはfloatの配列は機能しません!私がデバッグしているときにわかるように、私は配列を受け取っていますが、何らかの理由でアサーションが機能しません。

enter image description here

+2

あなたは「動作しない」とはどういう意味ですか?どのようなアウトプットを受け取りましたか?代わりにあなたは何を期待しましたか? – Flimzy

+0

'ok'がfalseであることを意味しません!しかし、あなたの答えは私のためにすべてを明確にしてくれます! –

答えて

5

あなたの質問は不明であるが、次のように煮詰めるために表示されます。デフォルトでは

、のfloat64にjson.Unmarshalアンマーシャルすべての数字を、JSONのすべての数字が浮いているので。他のタイプが必要な場合は、ターゲットタイプで特定のタイプを使用する必要があります。例:VS

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)} 

VS:

var x []int64 
json.Unmarshal([]byte(`[1,2,3]`), &x) // []int64{1,2,3} 
+0

感謝します、ありがとうございます!私はその時点で非整列化できませんので、 '[] interface {}'配列を繰り返し実行し、すべての値がfloatであるかどうかをチェックする必要があります! –