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