> 백엔드 개발 > Golang > 필드 이름과 String() 메서드를 사용하여 Go 구조체를 쉽게 인쇄하려면 어떻게 해야 합니까?

필드 이름과 String() 메서드를 사용하여 Go 구조체를 쉽게 인쇄하려면 어떻게 해야 합니까?

Barbara Streisand
풀어 주다: 2024-12-06 15:58:11
원래의
1004명이 탐색했습니다.

How Can I Easily Print Go Structs with Their Field Names and String() Methods?

필드 String()을 사용하여 구조체 인쇄

이 코드에서:

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿