我有这段代码使用列表上的迭代器
for x:= range s.faces.Iter(){
x.Render()
}
作为编译器指向,x的类型为interface {},并且我的代码中没有定义一个方法(i接口)Render()。
更改为
for x:= range s.faces.Iter(){
x.(faceTri).Render()
}
编译,因为有一个方法func(f faceTri)Render() 但在执行时会引发此运行时错误:
恐慌:界面转换:界面是* geometry.faceTri,而不是geometry.faceTri
(几何是包)
所以,任何人都可以指出一个资源来解释使用迭代器+转换的方法吗?
答案 0 :(得分:3)
这实际上在go中称为类型断言,而不是强制转换(强制转换是某些兼容类型之间的编译时转换,即int - > int32)。
根据您发布的错误,您的代码中只有一个小错误。 x
的基础类型是*faceTri
(指向faceTri结构的指针),因此类型断言应为x.(*faceTri)
编辑:
要澄清一些事情并超越你的问题。 go中的类型断言不是强制转换,例如:interface_with_underlying_type_int.(int64)
会发生恐慌,即使int
可以强制转换为int64
此外,您可以使用逗号成语
检查类型断言 not_interface, ok := some_interface.(some_type)
ok
是一个布尔值,表示转换是否成功,而不是引起运行时混乱。