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

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-22 05:03:15383ブラウズ

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

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