ホームページ >バックエンド開発 >Golang >フィールド名と String() メソッドを含む Go 構造体を簡単に出力するにはどうすればよいですか?

フィールド名と String() メソッドを含む Go 構造体を簡単に出力するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-06 15:58:11983ブラウズ

How Can I Easily Print Go Structs with Their Field Names and String() Methods?

フィールド String() を使用した構造体の出力

このコード内:

type A struct {
    t time.Time
}

func main() {
    a := A{time.Now()}
    fmt.Println(a)
    fmt.Println(a.t)
}

A が String() を実装していないことに注意してください。メソッドなので、 fmt.Println(a) はそのネイティブ表現を出力します。構造体の新しいフィールドごとに String() を更新するのは面倒な場合があります。

残念ながら、この動作は fmt パッケージに固有のものです。ただし、リフレクションを使用するヘルパー関数でこの問題を解決できます。

func PrintStruct(s interface{}, names bool) string {
    v := reflect.ValueOf(s)
    t := v.Type()
    // To avoid panic if s is not a struct:
    if t.Kind() != reflect.Struct {
        return fmt.Sprint(s)
    }

    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(":")
        }
        if v2.CanInterface() {
            if st, ok := v2.Interface().(fmt.Stringer); ok {
                b.WriteString(st.String())
                continue
            }
        }
        fmt.Fprint(b, v2)
    }
    b.WriteString("}")
    return b.String()
}

この関数はリフレクションを使用して構造体フィールドを反復処理し、利用可能な場合は String() メソッドを呼び出します。

使用法:

fmt.Println(PrintStruct(a, true))

オプションで、呼び出す構造体に String() メソッドを追加します。 PrintStruct():

func (a A) String() string {
    return PrintStruct(a, true)
}

これで、String() を含む構造体フィールドが自動的に出力されます。

メモ:

  • エクスポートプライベート フィールドを追加して、リフレクションにアクセスできるようにします。
  • 読みやすくするためにフィールド名を追加します (ただし、これはオプションです)。
  • このアプローチは、値が構造体でなくても機能するため、汎用性が高くなります。

以上がフィールド名と String() メソッドを含む Go 構造体を簡単に出力するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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