在 Go 语言的 subreddit 中,常有人问类似“我有这段代码但它没有按预期工作”的问题。以下是关于 Go 中 | 操作符的讨论:
|操作符的误解:|操作符常被误解为“或”,类似其他语言中的和类型声明方式,但实际上它更像是交集,只能接受列出的类型的交集部分,且不包括方法或结构字段。- 示例代码分析:如一段包含
MyStruct、OtherStruct及MySumType接口的代码,printVal函数根据传入类型打印不同信息,但实际能操作的只有==和&操作符,很多函数实现基本无用。 替代方案:
- 普通接口:优先考虑使用普通接口,如用
interface{}替代和类型,可通过扩展接口添加新方法,避免不必要的闭合。 - 封闭接口:定义包含未导出方法的封闭接口,如
Color接口,可进行类型切换,类似于其他语言的模式匹配,且能获得==操作符。 - 最后手段的技巧:可以使用
any(in)进行类型断言,但这种方式在代码复杂时会导致问题,如函数的泛型规格过多,难以组合,不建议普遍使用,但偶尔在孤立情况下可解决问题。
- 普通接口:优先考虑使用普通接口,如用
总之,在 Go 中要避免在自己的代码中直接使用 | 操作符,可通过其他方式接近所需功能。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。