在不同的套件中實現具有相同簽名的兩個介面
在Go 中,介面提供了一種為實現它們的類型定義契約的方法,確保實作給定介面的任何類型都必須提供其所有方法的實作。然而,在不同的套件中實作具有相同方法簽名的介面可能會導致混亂和不一致。
考慮以下場景:
<code class="go">// Package A package A type Doer interface { Do() string } func FuncA(doer Doer) { // Logic using doer.Do() } // Package B package B type Doer interface { Do() string } func FuncB(doer Doer) { // Logic using doer.Do() }</code>
現在,假設您的主套件中有一個類型 C它使用 Do() 的不同實作來實作 A.Doer 和 B.Doer。當 C 的實例傳遞給 FuncA() 時,它的行為與預期一致,利用 A.Doer 中定義的實作。但是,當將 C 傳遞給 FuncB() 時,由於 Do() 的實作不同,邏輯會觸發意外行為。
要解決此問題,有兩種推薦方法:
方法類型斷言:
根據Go FAQ,「僅按名稱匹配並要求類型一致是Go 類型系統中的一個重大簡化決策。但是,您可以執行方法類型斷言來驗證物件是否滿足特定的介面類型。例如:
<code class="go">if _, ok := obj.(A.Doer); ok { // obj conforms to A.Doer // Use obj.Do() as desired }</code>
包裝類型:
或者,您可以在物件周圍建立包裝類型,以實現具有所需邏輯的必要介面。例如,您可以擁有包裝 C 並提供 A.Do() 的特定實作的 DoerA,以及包裝 C 並提供 B.Do() 的實作的 DoerB。這種方法可讓您將適當的包裝類型傳遞給所需的函數,確保執行正確的邏輯。
以上是Go中如何處理不同套件中實作相同簽章的介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!