首頁 > 後端開發 > Golang > 為什麼 `fmt.Println` 不在 Go 中的結構成員上呼叫 `String()` 方法?

為什麼 `fmt.Println` 不在 Go 中的結構成員上呼叫 `String()` 方法?

DDD
發布: 2024-11-27 06:13:10
原創
230 人瀏覽過

Why Doesn't `fmt.Println` Call `String()` Methods on Struct Members in Go?

揭示內部工作原理:為什麼fmt.Println 繞過結構體的String() 方法

關於fmt.Println 的功能出現了一個有趣的觀察值當調用結構體物件時。雖然人們可能預期會為每個成員呼叫 String() 方法,但實際情況並非如此。檢查這種差異將揭示這種行為背後的根本原因。

根本原因

要了解為什麼fmt.Println 會跳過結構成員的String() 方法,必須考慮兩個關鍵因素:

  1. 導出狀態: 為bar 類型定義的String()方法未導出,以小寫字母開頭。這可以防止其他套件或程式碼模組存取它,從而使其不可用於 fmt.Println。
  2. 未匯出的欄位: foo 結構體中的欄位(b 和 bb)也未匯出,呈現它們對外部程式碼不可見。因此,fmt.Println 無法直接存取這些欄位來呼叫其 String() 方法。

解決方法

要修正此問題並啟用fmt.Println 對結構成員使用String() 方法,需要進行一些修改必要:

  1. 導出型別: 透過大寫首字母將Bar(以前稱為bar)聲明為導出類型。
  2. 匯出欄位: 將欄位 B 和 BB 匯出,名稱以大寫開頭字母。
  3. String() 方法: 為 Bar(以前稱為 bar)實作 String() 方法。

透過實作這些更改,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)
}
登入後複製

輸出:

{[bar] bar} [bar] bar
登入後複製

結論 >

導出狀態和字段可訪問性限制的理解Go 中的文檔闡明了為什麼fmt.Println本質上不使用 String() 方法作為結構成員。透過適當的導出約定來解決這些問題,可以實現所需的行為,從而促進程式碼的清晰度和一致性。

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板