使用Golang 介面實作不同類型的介面方法
在Go 中,通常希望不同類型的資料結構實作相同的介面提供一組通用的行為。例如,考慮兩個結構體:
type First struct { str string } type Second struct { str string }
我們希望兩個結構體都實作介面A:
type A interface { PrintStr() // Print First.str or Second.str }
但是,為每個結構體單獨實作PrintStr() 似乎是多餘的:
func (f First) PrintStr() { fmt.Print(f.str) } func (s Second) PrintStr() { fmt.Print(s.str) }
對於實現A 的所有結構來說,最好有一個單一的實現。嘗試直接執行此操作不起作用:
func (a A) PrintStr() { fmt.Print(a.str) }
原因是 a 沒有 str 欄位。相反,一個更優雅的解決方案涉及創建一個基本類型並將其嵌入到我們的兩個結構中:
type WithString struct { str string } type First struct { WithString } type Second struct { WithString } type A interface { PrintStr() // Print First.str or Second.str } func (w WithString) PrintStr() { fmt.Print(w.str) }
這裡,WithString 作為基本類型,First 和 Second 嵌入它。這為我們提供了 PrintStr() 的集中實作。
用法範例:
a := First{ WithString: WithString{ str: "foo", }, }
請注意,我們可以透過嵌入 WithString 的實例來建立 First 的實例。這項技術使我們能夠實現為實現同一介面的多種不同類型提供一個實現的目標。
以上是如何在 Golang 中實作不同類型的介面方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!