>백엔드 개발 >Golang >`fmt.Println`이 내 Struct의 `String()` 메서드를 사용하지 않는 이유는 무엇입니까?

`fmt.Println`이 내 Struct의 `String()` 메서드를 사용하지 않는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-22 05:03:15456검색

Why Doesn't `fmt.Println` Use My Struct's `String()` Method?

미스터리 발견: fmt.Println이 구조체에서 String() 메서드를 건너뛰는 이유

딜레마를 상상해 보십시오. 구조체에 대해 String() 메서드를 정의하여 사용자 정의를 제공합니다. 인쇄 동작을 수행하지만 fmt.Println은 이를 무시하여 읽을 수 없는 출력을 남깁니다. 다음 코드의 경우가 그렇습니다.

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 bar} [bar] bar

실제 출력:

{[0x176f44] 0x176f44} [bar] bar

이유 풀기

이에는 두 가지 핵심 요소가 있습니다. 동작:

  • 내보낼 수 없는 유형: 막대 유형은 내보내지지 않습니다. 즉, 동일한 패키지 내에서만 사용할 수 있습니다. 내보내지 않은 유형이 foo와 같은 내보낸 구조체에 포함되면 해당 메서드도 내보내지지 않습니다.
  • 내보내지 않은 필드: foo의 b 및 bb 필드는 내보내지지 않습니다. 즉, String() 메서드는 내보내지지 않습니다. fmt.Println으로 액세스할 수 있습니다.

해결 방법

이 문제를 해결하려면 bar 유형과 foo 필드를 모두 내보내야 합니다. 수정된 코드는 다음과 같습니다.

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)
}

Playground: https://play.golang.org/p/OhoIcB7cA3

이렇게 하면 Bar와 해당 String() 메서드를 모두 내보내서 다음을 허용할 수 있습니다. fmt.Println을 활용하세요. 결과적으로 원하는 출력을 얻습니다.

{bar bar} [bar] bar

결론적으로, fmt.Println이 이 강력한 사용자 정의 형식 지정 기능을 활용할 수 있도록 하려면 String() 메서드에 포함된 유형과 필드를 모두 내보내야 합니다.

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

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.