【问题标题】:iteration + casting in go迭代+铸造
【发布时间】:2011-03-16 23:56:19
【问题描述】:

我有这个在列表上使用迭代器的代码 sn-p

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

(几何就是包)

那么,任何人都可以向我指出一个资源来解释使用迭代器 + 强制转换的 go 方式吗?

【问题讨论】:

    标签: casting go


    【解决方案1】:

    这实际上在 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 是一个布尔值,指示转换是否成功,而不是导致运行时恐慌。

    【讨论】:

    • 成功了,问题实际上是我断言了错误的类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多