딜레마를 상상해 보십시오. 구조체에 대해 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
이에는 두 가지 핵심 요소가 있습니다. 동작:
이 문제를 해결하려면 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!