Go에서 포인터를 사용하여 구조체 값 인쇄
Go에서는 다음과 같은 구조체 값을 인쇄해야 하는 상황에 직면하는 것이 일반적입니다. 다른 구조체에 대한 포인터를 포함합니다. 그러나 fmt.Printf()에서 %v 형식 지정자의 기본 동작은 실제 값 대신 포인터 주소를 표시합니다.
다음 예를 고려하십시오.
package main import "fmt" type A struct { a int32 B *B } type B struct { b int32 } func main() { a := &A{ a: 1, B: &B{ b: 2, }, } fmt.Printf("v ==== %+v \n", a) }
위 코드는 다음과 같습니다.
v ==== &{a:1 B:0xc42000e204}
보시다시피 B 필드는 실제 주소가 아닌 B 구조체의 메모리 주소로 인쇄됩니다. value.
Stringer 인터페이스를 사용한 사용자 정의 인쇄
중첩 구조체의 내용을 인쇄하는 한 가지 방법은 A 및 B 유형 모두에 대해 Stringer 인터페이스를 구현하는 것입니다. Stringer 인터페이스에는 값의 문자열 표현을 반환하는 String()이라는 단일 메서드가 필요합니다.
다음은 Stringer 인터페이스를 사용하여 업데이트된 예입니다.
package main import "fmt" type A struct { a int32 B *B } type B struct{ b int32 } func (aa *A) String() string { return fmt.Sprintf("A{a:%d, B:%v}",aa.a,aa.B) } func (bb *B) String() string { return fmt.Sprintf("B{b:%d}",bb.b) } func main() { a := &A{a: 1, B: &B{b: 2}} // using the Stringer interface fmt.Printf("v ==== %v \n", a) // or just print it yourself however you want. fmt.Printf("v ==== A{a:%d, B:B{b:%d}}\n", a.a, a.B.b) // or just reference the values in the struct that are structs themselves // but this can get really deep fmt.Printf("v ==== A{a:%d, B:%v}", a.a, a.B) }
이제 출력은 다음과 같습니다. :
v ==== A{a:1, B:B{b:2}}
수동 인쇄
경우 Stringer 인터페이스를 구현하고 싶지 않다면 print 문을 사용하여 원하는 구조체 표현을 수동으로 인쇄할 수 있습니다. 예를 들어 중첩된 구조체의 필드에 액세스하여 별도로 인쇄할 수 있습니다.
fmt.Printf("v ==== A{a:%d, B:B{b:%d}}\n", a.a, a.B.b)
이 접근 방식을 사용하면 출력 형식을 완벽하게 제어할 수 있습니다.
위 내용은 Go에서 포인터를 사용하여 중첩된 구조체의 값을 인쇄하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!