Go에서 fmt.Println이 구조체의 멤버 String() 메서드를 사용하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-23 07:47:27
원래의
901명이 탐색했습니다.

Why Doesn't fmt.Println Use a Struct's Member String() Methods in Go?

구조체 멤버를 사용한 fmt.Println의 동작 이해

Go에서는 구조체에서 fmt.Println을 호출하면 출력이 나올 것으로 예상합니다. 각각의 String() 메서드를 사용하여 구조체 멤버의 문자열 표현입니다. 그러나 항상 그런 것은 아닙니다.

다음 코드를 고려하십시오.

package main

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)
}
로그인 후 복사

이 코드에서는 문자열 "bar를 반환하는 String() 메서드를 사용하여 bar 유형을 정의합니다. ." 또한 각각 bar 유형에 대한 슬라이스 및 포인터인 b 및 bb 필드를 사용하여 foo 유형을 정의합니다.

f, f.b 및 f.bb에서 fmt.Println을 호출하면 다음과 같은 출력을 얻습니다. :

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

이건 우리가 예상했던 것과는 다른 내용인데, is:

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

fmt.Println 동작의 이유

fmt.Println이 호출될 때 멤버의 String() 메서드를 사용하지 않는 데에는 몇 가지 이유가 있습니다. 구조체:

  • String() 메서드는 다음과 같습니다. 내보내지 않음: bar 유형의 String() 메서드는 소문자로 시작하므로 내보내지 않습니다. 내보낸 유형 및 메소드는 다른 패키지에서 액세스할 수 있지만 내보내지 않은 유형 및 메소드는 액세스할 수 없습니다.
  • 필드가 내보내지지 않습니다. foo 유형의 b 및 bb 필드도 소문자로 시작하므로 내보내지 않습니다. . 따라서 다른 패키지에서 액세스할 수 없으며 fmt.Println으로 인쇄되지 않습니다.

해결 방법

이 문제를 해결하려면 다음 사항을 확인해야 합니다. String() 메서드와 구조체의 필드를 내보냅니다. 수정된 코드는 다음과 같습니다.

package main

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
로그인 후 복사
로그인 후 복사

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

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