구조체와 메서드를 내보내지 않으면 `fmt.Println`이 구조체의 `String()` 메서드를 사용하지 않는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-11-19 17:50:03
원래의
1031명이 탐색했습니다.

Why doesn't `fmt.Println` use a struct's `String()` method unless the struct and method are exported?

fmt.Println 및 String() 메서드

fmt.Println이 호출될 때 멤버의 String() 메서드를 활용하지 않는 이유는 무엇입니까? 구조체? 기본 메커니즘을 살펴보겠습니다.

다음 코드를 고려하세요.

import "fmt"

type Bar struct{}

func (b Bar) String() string {
    return "bar"
}

type Foo struct {
    B []*Bar
    BB *Bar
}

func main() {
    f := Foo{B: []*Bar{&Bar{}}, BB: &Bar{}}
    fmt.Println(f, f.B, f.BB)
}
로그인 후 복사

이 코드는 예상되는 출력을 생성합니다.

{[(addr: 0x8201dde620)] (addr: 0x8201dde620)} [bar] bar
로그인 후 복사

그러나 출력이 왜 이렇게 나오는지 궁금할 수도 있습니다.

{[bar] bar} [bar] bar
로그인 후 복사
로그인 후 복사

메모리 주소 대신 멤버의 String() 표현을 표시합니다.

이유는 Bar 유형과 해당 유형 모두의 내보내기되지 않은 특성에 있습니다. 문자열() 메서드. Go에서는 내보내지 않은 멤버와 메서드는 정의된 패키지 내에서만 액세스할 수 있습니다. fmt.Println은 동일한 패키지의 일부가 아니기 때문에 내보내지 않은 요소에 액세스할 수 없습니다. 따라서 내장되지 않은 유형에 대한 메모리 주소를 인쇄하는 기본 동작을 사용합니다.

이 문제를 해결하려면 Bar 유형과 해당 String() 메서드를 모두 내보내야 합니다. 또한 적절한 JSON 인코딩 및 디코딩을 위해 Foo 구조체의 필드도 내보내야 합니다.

올바른 접근 방식을 보여주는 수정된 코드 버전은 다음과 같습니다.

import "fmt"

type Bar struct{}

func (b Bar) String() string {
    return "bar"
}

type Foo struct {
    B []*Bar
    BB *Bar
}

func main() {
    f := Foo{B: []*Bar{&Bar{}}, BB: &Bar{}}
    fmt.Println(f)
}
로그인 후 복사

이러한 변경 사항에 따라 구현되면 이제 출력은 다음과 같습니다.

{[bar] bar} [bar] bar
로그인 후 복사
로그인 후 복사

이 예에서는 fmt.Println과 같은 포맷터와의 적절한 통합을 위해 내보낸 유형 및 메서드를 사용하는 것의 중요성을 강조합니다.

위 내용은 구조체와 메서드를 내보내지 않으면 `fmt.Println`이 구조체의 `String()` 메서드를 사용하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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