カスタム フィールド表現を使用した構造体の印刷
Go では、fmt.Println を使用して構造体を直接印刷すると、そのネイティブ表現が表示されます。この制限を回避し、個々の構造体フィールドの文字列表現を出力するには、各構造体にカスタム String() メソッドを実装する方法があります。ただし、この方法は構造体の複雑さが増すにつれて面倒になり、フィールドの追加または削除に応じて継続的に更新する必要があります。
リフレクションベースのソリューション
この課題に対処するには、次のようにします。 (reflect パッケージを使用して) リフレクションの力を利用して、構造体のフィールドを動的に反復処理し、次の場合には String() メソッドを呼び出すことができます。
func PrintStruct(s interface{}, names bool) string { v := reflect.ValueOf(s) t := v.Type() 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() }
このヘルパー関数を使用すると、次のように構造体のフィールドを出力できます。
a := A{time.Now(), 2, "hi!"} fmt.Println(PrintStruct(a, true))
カスタム文字列メソッドを使用してさらに簡略化する
構造体の出力をさらに簡素化するために、単純に構造体に委譲する String() メソッドを定義できます。 PrintStruct() 関数:
func (a A) String() string { return PrintStruct(a, true) }
このアプローチを使用すると、構造体を変更するたびに String() メソッドを変更する必要がなくなりました。
注:
以上がカスタムフィールド表現を含む Go 構造体を効率的に出力するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。