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

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-23 07:47:27902ブラウズ

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 サイトの他の関連記事を参照してください。

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