我有这个代码。我希望接口(interface)的类型断言为 int。但是,接口(interface)的类型改为 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 is a float64”。您可以在那里运行代码 https://play.golang.org/p/9L9unW8l3n
最佳答案
数字被编码为“Json 数字”Unmarshal 将 Json 数字解码为 float 。来自文档:
Floating point, integer, and Number values encode as JSON numbers.
To unmarshal JSON into an interface value, Unmarshal stores one of these in the interface value:
bool, for JSON booleans float64, for JSON numbers string, for JSON strings []interface{}, for JSON arrays map[string]interface{}, for JSON objects nil for JSON null
关于go - 将 JSON 整数解码为空接口(interface)会导致错误的类型断言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39152481/