我有这个在清单上使用迭代器的代码片段for x:= range s.faces.Iter(){ x.Render()}正如编译器所指出的那样,x的类型为interface {},并且在我的代码中没有定义方法(i interface)Render()。更改为for x:= range s.faces.Iter(){ x.(faceTri).Render()}进行编译,因为有一个func(f faceTri)Render()方法,但是在执行时会引发运行时错误:panic:接口转换:接口是* geometry.faceTri,而不是geometry.faceTri(几何是包装)因此,有人可以指向我介绍解释使用迭代器+强制转换的方法的资源吗?
1 回答
宝慕林4294392
TA贡献2021条经验 获得超8个赞
实际上,这在go中称为类型断言,而不是强制类型转换(转换是某些兼容类型之间的编译时转换,即int-> int32)。
根据您发布的错误,您的代码中只有一个小错误。的基本类型x
为*faceTri
(指向faceTri结构的指针),因此类型断言应为x.(*faceTri)
编辑:
需要澄清的几件事超出了您的问题。go中的类型断言不是强制转换,例如:interface_with_underlying_type_int.(int64)
即使int
可以强制转换为,也会发生恐慌int64
另外,您可以使用comma-ok惯用语检查类型断言
not_interface, ok := some_interface.(some_type)
ok
是一个布尔值,指示转换是否成功,而不是引起运行时恐慌。
- 1 回答
- 0 关注
- 217 浏览
添加回答
举报
0/150
提交
取消