이 코드에서:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!