ホームページ  >  記事  >  バックエンド開発  >  構造体とメソッドがエクスポートされない限り、「fmt.Println」は構造体の「String()」メソッドを使用しないのはなぜですか?

構造体とメソッドがエクスポートされない限り、「fmt.Println」は構造体の「String()」メソッドを使用しないのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-19 17:50:031027ブラウズ

Why doesn't `fmt.Println` use a struct's `String()` method unless the struct and method are exported?

fmt.Println および String() メソッド

fmt.Println が呼び出されたときにメンバーの String() メソッドを利用しないのはなぜですか構造体?基礎となるメカニズムを調べてみましょう。

次のコードを考えてみましょう:

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

このコードは期待どおりの出力を生成します:

{[(addr: 0x8201dde620)] (addr: 0x8201dde620)} [bar] bar

しかし、なぜ出力が出力されるのか不思議に思うかもしれません。これは次のとおりではありません:

{[bar] bar} [bar] bar

これは、メモリの代わりにメンバーの String() 表現を表示します。

その理由は、Bar 型とその String() メソッドの両方がエクスポートされないという性質にあります。 Go では、エクスポートされていないメンバーとメソッドは、それらが定義されているパッケージ内でのみアクセスできます。 fmt.Println は同じパッケージの一部ではないため、これらのエクスポートされていない要素にはアクセスできません。したがって、非組み込み型のメモリ アドレスを出力するデフォルトの動作に頼ります。

この問題に対処するには、Bar 型とその String() メソッドの両方をエクスポートする必要があります。さらに、適切な JSON エンコードとデコードのために、Foo 構造体のフィールドもエクスポートする必要があります。

正しいアプローチを示すコードの修正バージョンを次に示します。

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

この例では、フォーマッタと適切に統合するためにエクスポートされた型とメソッドを使用することの重要性を強調しています。 fmt.Println のような

以上が構造体とメソッドがエクスポートされない限り、「fmt.Println」は構造体の「String()」メソッドを使用しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。