踩坑第一期
可能大家工作中都会遇到类型断言,即接口类型断言是否为某种strcut类型i.(A)
或某种struct的指针类型i.(*A)
。
那么当一个想要一个interface{}
类型既想转换成多种类型,且多种类型并不属于同一种。这句话说的可能比较绕圈,下面举个例子来看下。
当有两个SA和SB,当我们想要从字符串翻转成结构体时。我们可以
没问题,输出结果是
sa {logan 18 Beijing}
PASS
但是当结构体内容时由其他结构体,以interface{}
类型进行返回时,那么情景可能如下。
如果50和51行都注释掉了的话,那么结果会输出
it2 data type is map[string]interface {}
ti3 type assertion error, it isn't type SA
ti4 type assertion error, it isn't type SB
ti5 is map[addr:Beijing age:18 name:logan]
PASS
意味着data转换成了map[string]interface{}
如果转换成map[string]interface{}
类型后,那么想要key中的value还需要继续类型断言。
为什么会转成map[string]interface{}
呢?因为对象底层类型,当unmarshal
时并不知道对象底层类型。
那么,是否有一种希望转成的类型当我们的确希望转换成某种类型,如SA或SB。
答案是需要告诉结构类型的底层类型是什么,才可做此类型的类型断言。
解开注释50或51行后,则输出结果成为
it2 data type is *main.SB
ti3 type assertion error, it isn't type SA
ti4 is &{logan 18 }
ti5 type assertion error, it isn't type map[string]interface{}
PASS