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

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

Mary-Kate Olsen
リリース: 2024-11-23 07:47:27
オリジナル
965 人が閲覧しました

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

このコードでは、文字列 "bar" を返す String() メソッドを使用してバー タイプを定義します。 。」また、フィールド b と bb を持つ foo 型も定義します。これらは、それぞれスライスと bar 型へのポインタです。

f、f.b、および f.bb で fmt.Println を呼び出すと、次の出力が得られます。 :

{[0x176f44] 0x176f44} [bar] bar
ログイン後にコピー

これは私たちが期待するものとは異なります。

{[bar] bar} [bar] bar
ログイン後にコピー
ログイン後にコピー

fmt.Println の動作の背後にある理由

fmt.Println が呼び出されたときにメンバーの String() メソッドを使用しない理由はいくつかあります。にstruct:

  • String() メソッドはエクスポートされません: バー タイプの String() メソッドは小文字で始まるためエクスポートされません。エクスポートされた型とメソッドは他のパッケージからアクセスできますが、エクスポートされていないものはアクセスできません。
  • フィールドはアンエクスポートされます: foo 型のフィールド b および bb も、小文字で始まるためアンエクスポートされます。 。したがって、他のパッケージからはアクセスできず、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
ログイン後にコピー
ログイン後にコピー

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

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