想像一個困境:為結構體定義一個String() 方法來提供自訂列印行為,但fmt.Println 似乎忽略它,導致輸出不可讀。以下程式碼就是這種情況:
package main import ( "fmt" ) type bar struct { } func (b bar) String() string { return "bar" } type foo struct { b []*bar bb *bar } func main() { f := foo{b: []*bar{&bar{}}, bb: &bar{}} fmt.Println(f, f.b, f.bb) }
預期輸出:
{bar bar} [bar] bar
實際輸出:
{[0x176f44] 0x176f44} [bar] bar
這背後有兩個關鍵因素行為:
要解決此問題,我們需要匯出 bar 類型和 foo 欄位。這是修正後的程式碼:
type Bar struct { } func (b Bar) String() string { return "bar" } type foo struct { B []Bar BB Bar } func main() { f := foo{B: []Bar{Bar{}}, BB: Bar{}} fmt.Println(f) }
Playground:https://play.golang.org/p/OhoIcB7cA3
這確保了Bar 及其String() 方法都已匯出,從而允許fmt.Println 來利用它。因此,我們獲得了所需的輸出:
{bar bar} [bar] bar
總之,請記住導出String() 方法中涉及的類型和字段,以使fmt.Println 能夠利用這個強大的自定義格式化功能。
以上是為什麼 `fmt.Println` 不使用我的 Struct 的 `String()` 方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!