在 Go 中,嵌入式結構體繼承其基本結構體的字段和方法。但是,當基本結構和嵌入結構都實作同名的方法時,可能會出現衝突。本文探討了一種在不影響基本結構的情況下覆蓋嵌入結構體方法的解決方案。
考慮以下程式碼:
<code class="go">package main import "fmt" type Base struct { val int } func (b *Base) Set(i int) { b.val = i } type Sub struct { Base changed bool } func (b *Sub) Set(i int) { b.val = i b.changed = true } func main() { s := &Sub{} s.Base.Set(1) var b *Base = &s.Base // Both print the same value fmt.Printf("%+v\n", b) fmt.Printf("%+v\n", s) }</code>
這裡,Sub 類型嵌入了 Base 類型。 Sub 和 Base 都有一個名為 Set 的方法,當你呼叫 s.Base.Set() 時,你就繞過了 Sub.Set() 方法,直接呼叫了 Base.Set() 方法。
To重寫嵌入結構的方法,您可以呼叫 Sub.Set() 方法。在 Go 中,當類型實作與其嵌入類型同名的方法時,嵌入方法將被隱藏。
以下是程式碼的更新版本:
<code class="go">func (b *Sub) Set(i int) { b.Base.Set(i) // Call the Base.Set() method b.changed = true } func main() { s := &Sub{} s.Set(1) var b *Base = &s.Base // Note: b.val is now 1 // s.changed is now true fmt.Printf("%+v\n", b) fmt.Printf("%+v\n", s) }</code>
在此範例中,當呼叫s.Set(1) 時,將呼叫Sub.Set() 方法,該方法再調用Base.Set() 方法。這會更新嵌入 Sub 中的 Base 結構體的 val 欄位。更改的欄位也將被設為 true 以指示該值已被修改。
此解決方案可讓您覆蓋嵌入結構的方法而不影響基本結構。它是 Go 中用來實現程式碼可重複使用性和靈活性的常用技術。
以上是如何在不影響基本結構的情況下重寫 Go 中的嵌入結構方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!