在迭代中+迭代

时间:2010-07-16 14:16:53

标签: casting go

我有这段代码使用列表上的迭代器

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

(几何是包)

所以,任何人都可以指出一个资源来解释使用迭代器+转换的方法吗?

1 个答案:

答案 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是一个布尔值,表示转换是否成功,而不是引起运行时混乱。

相关问题