Go 嵌入類型中意外的String() 方法行為
在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) }
在此程式碼中,Engineer 類型嵌入了 Person 和 TaxPayer 類型,它們定義自己的 String() 方法來格式化對應的資料。但是,如果我們實例化一個Engineer 物件並呼叫fmt.Println(engineer),則輸出並不符合預期:
{name: John Doe, age: 35 3 Construction}
此輸出表示正在呼叫Engineer.String() 方法,但TaxPayer.String () 方法也對結果有貢獻。這是因為 String() 方法在嵌入時會提升為 Engineer 類型,而 Person.String() 和 TaxPayer.String() 方法都可以呼叫。
為了澄清這一點,請考慮以下內容場景:
fmt.Println(engineer.String()) // Compile error: ambiguous selector engineer.String
在這種情況下,編譯器會引發錯誤,因為工程師有多個提升的String() 方法,導致選擇器不明確。然而,fmt.Println(engineer) 會成功,因為編譯器會根據其欄位自動選擇 Engineer 的預設格式。
造成這種明顯差異的原因是 fmt.Println() 函數本質上委託了字串轉換到 fmt 套件。當它遇到實作 fmt.Stringer 介面(定義 String() 方法)的值時,它會呼叫該方法來取得字串表示形式。
在我們的範例中,因為 Person.String() 和TaxPayer.String() 存在,兩者均未晉升為工程師,並使用預設格式。然而,在 fmt.Println(engineer.String()) 的情況下,編譯器會遇到不明確的選擇器並引發錯誤。
總之,當多個嵌入類型定義了此類方法。了解嵌入和方法提升的機制非常重要,以避免潛在的混亂並確保所需的輸出。
以上是為什麼 Go 的'fmt.Println”使用嵌入類型和多個'String()”方法會產生意外的輸出?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Golang在实际应用中表现出色,以简洁、高效和并发性著称。1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go語言的核心特性包括垃圾回收、靜態鏈接和並發支持。 1.Go語言的並發模型通過goroutine和channel實現高效並發編程。 2.接口和多態性通過實現接口方法,使得不同類型可以統一處理。 3.基本用法展示了函數定義和調用的高效性。 4.高級用法中,切片提供了動態調整大小的強大功能。 5.常見錯誤如競態條件可以通過gotest-race檢測並解決。 6.性能優化通過sync.Pool重用對象,減少垃圾回收壓力。

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

關於SQL查詢結果排序的疑惑學習SQL的過程中,常常會遇到一些令人困惑的問題。最近,筆者在閱讀《MICK-SQL基礎�...

golang ...

Go語言中如何對比並處理三個結構體在Go語言編程中,有時需要對比兩個結構體的差異,並將這些差異應用到第�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Atom編輯器mac版下載
最受歡迎的的開源編輯器

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Linux新版
SublimeText3 Linux最新版

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能