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 数字解码为浮点数。从文档:

元帅

浮点、整数和数字值编码为 JSON 数字。

解组

为了将 JSON 解组为接口值,Unmarshal 将其中一项存储在接口值中:

bool,对于 JSON 布尔值 float64,对于 JSON 数字字符串,对于 JSON 字符串 []interface{},对于 JSON 数组 map[string]interface{},对于 JSON 对象 nil 对于 JSON null

于 2016-08-25T18:38:54.267 回答