掃描Go 中實作介面的結構
背景:
在Go 中,我們可能會遇到一些場景我們需要動態存取實現公共介面的多個結構。但是,由於 Go 是靜態類型語言,因此它沒有提供內建機制來掃描特定介面類型的所有結構。
問題:
給定一個具有 start() 和 stop() 方法的接口,是否可以檢索實現該接口的所有結構的列表?這些資訊將使我們能夠動態地在已實作的結構體的所有實例上呼叫 start() 和 stop()。
答案:
不幸的是,不,這是不可能直接實現的。 Go 的靜態類型消除了未使用的類型定義,使得存取應用程式中未明確使用的結構變得困難。
替代方法:
取代動態掃描結構,替代解決方案是建立一個全域地圖或切片。然後,實作該介面的每個結構都可以在應用程式初始化期間使用 init() 函數向該映射添加一個實例。這確保了各種結構的所有實例都可以存取並且可以集中管理。
範例:
<code class="go">var instMap = map[string]StartStopper type A struct {} func init() { instMap["A"] = new(A) }</code>
透過迭代此映射,我們可以動態呼叫所有已註冊實例的 start() 方法。
多個實例的注意事項:
如果每種類型可以存在多個實例,則需要手動將實例新增至地圖每當它們被建立時。此外,當不再需要實例時,您應該從地圖中刪除它們,以防止垃圾收集器忽略它們。
以上是你能動態找出Go中實作介面的所有結構嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!