2 回答
TA贡献1827条经验 获得超8个赞
问题是你没有传递 a Packet,你传递的map[string]interface{}是 a ,就 Go 而言,这是一种完全不同的类型。
如果您使用pack := make(Packet)or pack := Packet{},它将按预期工作。
TA贡献1789条经验 获得超10个赞
到目前为止的答案和评论是误解,混淆,或者至少在类型断言和类型转换之间的区别中刷了很多细节。
语法thing.(AType)是类型断言。它将在运行时进行评估。何时成功(即ok == true)的标准可以归结为两种情况:
thing从字面上看是 typeAType。不是像您的Packet.AType是接口,thing满足接口。
在所有其他情况下,ok将是false(或者如果您使用单值版本foo := bar.(Baz),foo将是适当的零值)。
语法AType(thing)是类型转换。它将在编译时进行评估。类型转换要求内存中的结构AType和任何类型thing都是相同的。
因此,在您的示例中,类型断言packet, ok := pack.(Packet)导致ok == false因为Packet是非接口类型,并且packet不是字面上的那种类型,而是类型map[string]interface。
但是,您可以进行类型转换Packet(pack),因为类型Packet和变量pack具有相同的底层内存结构,map[string]interface{}
- 2 回答
- 0 关注
- 231 浏览
添加回答
举报
