在此代码中:
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() 的结构体字段将被自动打印。
注释:
以上是如何轻松打印 Go 结构及其字段名称和 String() 方法?的详细内容。更多信息请关注PHP中文网其他相关文章!