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
注:
さらに便宜を図るため、単純に呼び出す構造体の String() メソッドを定義できます。 PrintStruct:
func (a A) String() string { return PrintStruct(a, true) }
以上が各構造体に String() メソッドを明示的に定義せずに Go 構造体の出力をカスタマイズするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。