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