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