ホームページ > バックエンド開発 > Golang > `fmt.Println` が Struct の `String()` メソッドを使用しないのはなぜですか?

`fmt.Println` が Struct の `String()` メソッドを使用しないのはなぜですか?

Susan Sarandon
リリース: 2024-11-22 05:03:15
オリジナル
439 人が閲覧しました

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
ログイン後にコピー

理由の解明

この背景には 2 つの重要な要素があります動作:

  • エクスポートされていないタイプ: バーのタイプはエクスポートされていません。つまり、同じパッケージ内でのみ使用できます。 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
ログイン後にコピー
ログイン後にコピー

結論として、fmt.Println がこの強力なカスタム書式設定機能を活用できるように、String() メソッドに含まれる型とフィールドの両方をエクスポートすることを忘れないでください。

以上が`fmt.Println` が Struct の `String()` メソッドを使用しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート