Golang:使用特定实现扫描结构
在 Go 中,使用共享接口操作多个结构可能会带来挑战。虽然可以单独处理每个结构实例,但您可能会遇到自动查找和操作遵守特定接口的所有结构的需要。
问题
场景涉及通过多个结构(A、B 和 C)实现接口 I。应用程序启动时,您需要为每个 A、B 和 C 实例调用 start() 方法。同样,终止时,您需要对这些实例调用 stop() 方法。但是,您希望避免在代码中对这些特定结构进行硬编码,以便在引入实现 I 接口的新结构时进行无缝修改。
答案
不幸的是,在Go中,你设想的方法是不可行的。 Go 是一种静态类型语言,链接器消除了未使用的类型定义和方法。因此,代码中未显式引用的类型将被省略。
替代解决方案
另一种方法是创建一个全局映射(或切片)来存储实现 I 接口的每个结构的实例。这些实例可以在初始化期间使用 init 函数注册:
<code class="go">var instMap = map[string]StartStopper type A struct {} func init() { instMap["A"] = new(A) }</code>
在启动期间,您可以迭代地图并在每个实例上调用 Start() 方法。
处理多个实例
如果每种结构类型可以有多个实例,则您需要修改注册过程以在创建实例时将实例添加到地图中。您还应该在实例不再使用时将其删除,以防止潜在的内存泄漏。
以上是如何动态扫描和操作Golang中实现特定接口的结构?的详细内容。更多信息请关注PHP中文网其他相关文章!