首頁 > 後端開發 > Golang > 主體

如何在運行時動態發現實現Go介面的實例?

Susan Sarandon
發布: 2024-10-29 05:51:31
原創
353 人瀏覽過

 How to Dynamically Discover Instances Implementing a Go Interface at Runtime?

Golang:發現實作介面的實例

在Golang 中,通常需要對特定類型的實例或實作介面的實例執行操作一個介面特定的介面。然而,該語言的嚴格類型化在識別運行時滿足給定標準的所有實例方面提出了挑戰。

問題概述

考慮以下用例:

  • 介面 I 定義了兩個方法:start() 和 stop()。
  • 多個結構體(A、B 和 C)實作介面 I。
  • 在程式啟動期間,應在 A、B 和 C 的所有實例上呼叫 start()。
  • 同樣,在程式終止期間,應在這些實例上呼叫 stop()。
  • 為了促進動態發現,最好不要在程式碼中硬編碼結構體名稱。

解決方案討論

Golang 的類型系統不允許運行時檢索所有實現介面的類型。這是因為 Go 是靜態類型的,編譯器會消除未使用的類型和方法來最佳化產生的二進位。

替代方法

另一個解決方案是維護全域將識別碼與實作介面的實例相關聯的對應或切片。每個結構體都可以透過向該全域集合添加實例來初始化自身。

例如:

<code class="go">var instMap = map[string]StartStopper

type A struct {}

func init() {
    instMap["A"] = new(A)
}</code>
登入後複製

在啟動和終止期間,程式可以迭代全域集合並呼叫適當的方法

多個實例的擴充

如果每種類型可以存在多個實例,則每當建立新實例並刪除時,都必須更新全域集合它不再使用了。這確保了垃圾收集器的正確處理。

以上是如何在運行時動態發現實現Go介面的實例?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板