在Go中,當處理具有相同方法簽署但定義在不同套件中的多個介面時,可能會出現以下情況實作兩個介面的類型會導致意外行為。
考慮在不同套件中定義的這兩個介面(Doer)和函數(FuncA 和 FuncB):
// Package A
type Doer interface { Do() string }
func FuncA(doer Doer)
// Package B
type Doer interface { Do() string }
func FuncB(doer Doer)
如果型別 C 實作了兩個套件中的 Doer 並且實作不同:
// Package main
type C int
func (c C) Do() string { return "A-specific implementation" }
func main() {
cA := C(0); A.FuncA(cA)
cB := C(0); B.FuncB(cB) // Behavior differs due to varying `Do()` implementations
}
為了解決這個問題,Go 的型別系統強調名稱匹配和型別一致性。雖然它允許一個物件滿足多個接口,但共享方法的實現必須遵守所有適用的接口契約。
在上述場景中,解決方法涉及實現包裝類型:
// Package main
type DoerA struct { C C }
func (d DoerA) Do() string { return "A-specific implementation" }
type DoerB struct { C C }
func (d DoerB) Do() string { return "B-specific implementation" }
func main() {
cA := DoerA{C(0)}; A.FuncA(cA)
cB := DoerB{C(0)}; B.FuncB(cB) // Correct behavior with separate implementations
}
透過建立這些包裝器,您可以根據預期的介面用法來控制 Do() 的實現,從而確保各個套件上下文中的一致性。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3