首頁  >  文章  >  後端開發  >  為什麼 `fmt.Println` 不使用我的 Struct 的 `String()` 方法?

為什麼 `fmt.Println` 不使用我的 Struct 的 `String()` 方法?

Susan Sarandon
Susan Sarandon原創
2024-11-22 05:03:15375瀏覽

Why Doesn't `fmt.Println` Use My Struct's `String()` Method?

揭開謎底:為什麼fmt.Println 會跳過結構體中的String() 方法

想像一個困境:為結構體定義一個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 這樣的導出結構時,它們的方法也不會被導出。
  • 未匯出的欄位: foo 中的欄位 b 和 bb 是未匯出的,這表示它們的 String() 方法不能透過 fmt.Println 存取。

照亮解決方案

要解決此問題,我們需要匯出 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn