在 Go 中,嵌入允許類型在其自己的結構中包含來自其他類型的字段和方法。但是,當多個嵌入類型定義具有相同名稱的方法(例如 String())時,某些情況可能會導致意外行為。
請考慮以下程式碼:
type Engineer struct { Person TaxPayer Specialization string } type Person struct { Name string Age int } func (p Person) String() string { return fmt.Sprintf("name: %s, age: %d", p.Name, p.Age) } type TaxPayer struct { TaxBracket int } func (t TaxPayer) String() string { return fmt.Sprintf("%d", t.TaxBracket) } func main() { engineer := Engineer{ Person: Person{ Name: "John Doe", Age: 35, }, TaxPayer: TaxPayer{3}, Specialization: "Construction", } fmt.Println(engineer) }
當執行此程式碼,它會產生以下輸出:
{name: John Doe, age: 35 3 Construction}
這個結果可能看起來很混亂,因為在嵌入類型Person 和中定義了多個String() 方法納稅人。但是,透過以下規則可以解決歧義:
此行為的關鍵要點是,只有在定義了單一、明確的方法時,嵌入類型才會提升其 String() 方法。如果存在多個方法,則嵌入類型沒有提升的 String() 方法,並且使用預設格式。
以上是為什麼當嵌入與 `String()` 方法衝突的類型時,Go 的 `fmt.Println` 會產生意外的輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!