在使用 Go 的 Stringer 介面時,使用者可能會遇到 String(將非指針對象傳遞給 fmt.Println 時,不會呼叫 ) 方法。為了闡明這種行為,讓我們檢查以下程式碼:
package main import "fmt" type Car struct { year int make string } func (c *Car) String() string { return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year) } func main() { myCar := Car{year: 1996, make: "Toyota"} fmt.Println(myCar) }
這裡,我們定義一個 Car 結構並將 String() 方法實作為值方法。但是,當我們將 myCar 作為參數傳遞給 fmt.Println 時,該物件將轉換為 interface{}。這會導致 fmt 套件使用自己的預設格式,繞過我們的 String() 方法。
理解此行為的關鍵在於我們已經在指標接收器上實作了 String() 方法(*車)。當傳遞 Car 類型的值時,編譯器不會自動將其轉換為指標。因此,fmt 套件無法將我們的 String() 方法與我們傳遞的值相符。
相反,要在傳遞非指針對象時調用我們的String() 方法,我們需要手動將值轉換為使用& 運算符的指針:
fmt.Println(&myCar)
通過這樣做,我們將指向Car 物件的指標傳遞給fmt.Println。這允許呼叫值接收器 String() 方法並應用我們的自訂格式。
總之,在使用 Stringer 介面時,請務必記住該方法必須在正確的接收器上定義類型。對於指針,指針接收器是合適的,而對於值類型,可以使用值接收器。如果不需要手動傳遞指針,可以考慮將 String() 方法實作為實際 Car 結構上的指針方法。
以上是為什麼使用非指針對象時「fmt.Println」不呼叫我的 Stringer 介面方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!