구조체 멤버를 사용한 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() 메서드와 구조체의 필드를 내보냅니다. 수정된 코드는 다음과 같습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!