0

私はこのコードを持っています。インターフェイスが int にアサートされる型であると期待しています。ただし、インターフェイスのタイプは代わりに float64 です。なぜこれが起こっているのか誰でも説明できますか?そして、それを回避する最善の方法は何ですか。

package main

import (
    "fmt"
    "encoding/json"
)

type obj struct {
    X interface{}
}

func main() {
    var x int
    x = 5
    o := &obj {
        X: x,
    }
    b, _ := json.Marshal(o)
    var newObj obj
    json.Unmarshal(b, &newObj)
    if _, ok := newObj.X.(int); ok {
        fmt.Println("X is an int")
    } else if _, ok := newObj.X.(float64); ok {
        fmt.Println("X is a float64")
    } else {
        fmt.Println("This does not make any sense")
    }
}

このコードは、「X は float64 です」と出力します。そこでコードを実行できますhttps://play.golang.org/p/9L9unW8l3n

4

1 に答える 1

5

数値は「Json 数値」としてエンコードされます Unmarshal は Json 数値を float としてデコードします。ドキュメントから:

元帥

浮動小数点、整数、数値は JSON 数値としてエンコードされます。

アンマーシャル

JSON をインターフェイス値に非整列化するために、Unmarshal は次のいずれかをインターフェイス値に格納します。

bool、JSON boolean の場合 float64、JSON 数値の場合 string、JSON 文字列の場合 []interface{}、JSON 配列の場合 map[string]interface{}、JSON オブジェクトの場合 nil JSON null の場合

于 2016-08-25T18:38:54.267 に答える