首頁  >  文章  >  後端開發  >  為什麼 fmt.Println 在 Go 中不使用 Struct 的成員 String() 方法?

為什麼 fmt.Println 在 Go 中不使用 Struct 的成員 String() 方法?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-23 07:47:27915瀏覽

Why Doesn't fmt.Println Use a Struct's Member String() Methods in Go?

理解fmt.Println 對結構體成員的行為

在Go 中,當我們在結構體上調用fmt.Println 時,我們期望它輸出結構體成員使用各自的String() 方法的字串表示形式。然而,情況並非總是如此。

考慮以下程式碼:

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)
}

在此程式碼中,我們使用String() 方法定義一個bar 類型,該方法傳回字串「bar」 」。我們也定義了一個帶有欄位b 和bb 的foo 類型,它們分別是切片和指向bar 類型的指標。 f.bb 上呼叫fmt.Println 時,我們得到以下輸出:

這和我們想像的不一樣,是:
{[0x176f44] 0x176f44} [bar] bar

{[bar] bar} [bar] bar
fmt.Println 行為背後的原因

fmt.Println 在呼叫時不使用成員的String()方法有幾個原因在結構體上:

    String() 方法不是Exported:
  • bar 型中的 String()方法不會導出,因為它以小寫字母開頭。字段b 和bb 也未導出,因為它們以小寫字母開頭。列印。方法和結構中的欄位被匯出。

以上是為什麼 fmt.Println 在 Go 中不使用 Struct 的成員 String() 方法?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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