t와 *t의 차이점 이해
이 코드 조각에는 fmt를 구현하는 String 메소드가 있는 TT 유형이 있습니다. .Stringer 인터페이스:
package main import "fmt" type TT struct { a int b float32 c string } func (t *TT) String() string { return fmt.Sprintf("%+v", *t) } func main() { tt := &TT{3, 4, "5"} fmt.Printf(tt.String()) }
이 코드는 fmt 패키지가 작동하기 때문에 작동합니다. String 메서드를 호출하여 TT 값의 문자열 표현을 가져옵니다.
그러나 String 메서드가 포인터가 아닌 수신기를 사용하도록 수정되면
func (t *TT) String() string { return fmt.Sprintf("%+v", t) }
데드 루프가 발생합니다. . 이유를 설명해 보겠습니다.
fmt.Sprintf("% v", t)를 호출하면 *TT(TT에 대한 포인터) 값이 fmt 패키지에 전달됩니다. TT.String 메소드에는 포인터 수신기가 있으므로 fmt 패키지는 *TT 유형의 메소드 세트에서 이 메소드를 찾지 않습니다.
수신기를 포인터가 아닌 유형으로 변경한다는 것은 fmt 패키지가 TT의 메소드 세트에서 String 메소드를 찾으십시오. 그러나 이는 호출되는 메소드가 값의 형식을 지정하는 데 사용되는 메소드와 동일하기 때문에 무한 재귀로 이어집니다.
이 문제를 방지하려면 type 키워드를 사용하여 새 유형을 생성하여 fmt 패키지에 전달되는 값의 수신자 유형:
func (t TT) String() string { type TT2 TT return fmt.Sprintf("%+v", TT2(t)) }
이는 type 키워드로 생성된 새 유형에 메서드가 없기 때문에 작동하므로 fmt 패키지는 새 유형에서 String 메소드를 호출해 보십시오.
위 내용은 `fmt.Sprintf`를 사용할 때 메서드 수신기를 포인터에서 비포인터로 변경하면 데드 루프가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!