Go中反序列化后的类型转换问题记录
目录
在 Go 语言的世界中,类型转换基本上都是很显式的,但最近在编写 web 后台的时候需要进行 context
之间的共享传值,常常就会出现 interface{} 的转换,
最常见的做法就是进行 type assertion 来进行转换,正常来讲作为编写者我们都清楚自己数据的具体类型,然鹅,在某些中间步骤之后,我们的原始类型没有变,但是可能
会被中间类型所迷惑
最近发现到的是JSON反序列化时所做的隐式类型转换,起因是对 interface{} 的一次 assertion 报错
interface {} is float64, not uint32
为啥会有 float64 类型?完全不知情
接着仔细翻看了文档后,发现 json.Unmarshal
会把所有的数字统一都作为 float64 进行反序列化,因此在这里,我们会丢失我们原本的类型信息,故对这部分 interface{} 进行反射操作时,我们是不能得到真实的类型的,下面给出文档的描述
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