将JSON整数解组为空接口会导致错误的类型断言

时间:2016-08-25 18:33:59

标签: go go-interface

我有这个代码。我希望接口的类型声明为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

1 个答案:

答案 0 :(得分:3)

数字被编码为“Json数字”Unmarshal将Json数字解码为浮点数。来自文档:

Marshal

  

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

Unmarshal

  

要将JSON解组为接口值,Unmarshal存储其中一个   这些在界面值中:

     对于JSON数字字符串,对于JSON,

bool,对于JSON布尔值float64   strings [] interface {},用于JSON数组map [string] interface {},for   JSON对象nil为JSON null