Go FAQ:在泛型中的管道运算符不是求和类型

在 Go 语言的 subreddit 中,常有人问类似“我有这段代码但它没有按预期工作”的问题。以下是关于 Go 中 | 操作符的讨论:

  • | 操作符的误解| 操作符常被误解为“或”,类似其他语言中的和类型声明方式,但实际上它更像是交集,只能接受列出的类型的交集部分,且不包括方法或结构字段。
  • 示例代码分析:如一段包含 MyStructOtherStructMySumType 接口的代码,printVal 函数根据传入类型打印不同信息,但实际能操作的只有 ==& 操作符,很多函数实现基本无用。
  • 替代方案

    • 普通接口:优先考虑使用普通接口,如用 interface{} 替代和类型,可通过扩展接口添加新方法,避免不必要的闭合。
    • 封闭接口:定义包含未导出方法的封闭接口,如 Color 接口,可进行类型切换,类似于其他语言的模式匹配,且能获得 == 操作符。
    • 最后手段的技巧:可以使用 any(in) 进行类型断言,但这种方式在代码复杂时会导致问题,如函数的泛型规格过多,难以组合,不建议普遍使用,但偶尔在孤立情况下可解决问题。

总之,在 Go 中要避免在自己的代码中直接使用 | 操作符,可通过其他方式接近所需功能。

阅读 13
0 条评论