ホームページ > バックエンド開発 > Golang > 各構造体に String() メソッドを明示的に定義せずに Go 構造体の出力をカスタマイズするにはどうすればよいですか?

各構造体に String() メソッドを明示的に定義せずに Go 構造体の出力をカスタマイズするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-08 16:49:11
オリジナル
279 人が閲覧しました

How to Customize the Printing of Go Structs Without Explicitly Defining a String() Method for Each Struct?

カスタム フィールド形式による構造体の印刷

fmt.Println は組み込み型を便利に表示しますが、構造体に対する動作は冗長で有益ではない場合があります。追加のフィールドを持つ時間値を表す構造体を考えてみましょう:

type A struct {
    t time.Time
}
ログイン後にコピー

fmt.Println を使用してこの構造体を印刷すると、次の結果が得られます:

{{63393490800 0 0x206da0}}
ログイン後にコピー

これは容易に解釈できません。具体的には、構造体には String() メソッドがないため、フィールドを希望どおりにフォーマットできません。

問題:

カスタム文字列を含む構造体を出力するにはどうすればよいですか?フィールドごとに String() メソッドを明示的に定義せずに、そのフィールドの表現を作成します。 struct?

解決策:

リフレクションを使用して、構造体のフィールドを反復処理し、その String() メソッドを動的に呼び出すことができます。これを実現するヘルパー関数を次に示します。

func PrintStruct(s interface{}, names bool) string {
    v := reflect.ValueOf(s)
    t := v.Type()
    // Handle non-struct input
    if t.Kind() != reflect.Struct {
        return fmt.Sprint(s)
    }
    // Initialize buffer
    b := &bytes.Buffer{}
    b.WriteString("{")
    for i := 0; i < v.NumField(); i++ {
        if i > 0 {
            b.WriteString(" ")
        }
        v2 := v.Field(i)
        if names {
            b.WriteString(t.Field(i).Name)
            b.WriteString(":")
        }
        // Handle Stringer fields
        if v2.CanInterface() {
            if st, ok := v2.Interface().(fmt.Stringer); ok {
                b.WriteString(st.String())
                continue
            }
        }
        // Print non-Stringer fields
        fmt.Fprint(b, v2)
    }
    b.WriteString("}")
    // Return formatted string
    return b.String()
}
ログイン後にコピー

使用法:

この関数は、カスタム フィールドを含む構造体を出力するために使用できます。書式設定:

a := A{time.Now()}
fmt.Println(PrintStruct(a, true)) // Display field names
fmt.Println(PrintStruct(a, false)) // Omit field names
ログイン後にコピー

注:

  • PrintStruct 関数はエクスポートされた構造体フィールドを想定しています。
  • さらに便宜を図るため、単純に呼び出す構造体の String() メソッドを定義できます。 PrintStruct:

    func (a A) String() string {
      return PrintStruct(a, true)
    }
    ログイン後にコピー

以上が各構造体に String() メソッドを明示的に定義せずに Go 構造体の出力をカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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