Go의 Stringer 인터페이스로 작업할 때 사용자는 문자열( ) 포인터가 아닌 개체를 fmt.Println에 전달할 때 메서드가 호출되지 않습니다. 이 동작을 알아보기 위해 다음 코드를 살펴보겠습니다.
package main import "fmt" type Car struct { year int make string } func (c *Car) String() string { return fmt.Sprintf("{make:%s, year:%d}", c.make, c.year) } func main() { myCar := Car{year: 1996, make: "Toyota"} fmt.Println(myCar) }
여기에서는 Car 구조체를 정의하고 String() 메서드를 값 메서드로 구현합니다. 그러나 myCar를 fmt.Println에 대한 인수로 전달하면 객체가 인터페이스{}로 변환됩니다. 이로 인해 fmt 패키지는 String() 메서드를 우회하여 자체 기본 형식을 사용하게 됩니다.
이 동작을 이해하는 열쇠는 포인터 수신기에 String() 메서드를 구현했다는 사실에 있습니다(* 자동차). Car 유형의 값을 전달할 때 컴파일러는 이를 자동으로 포인터로 변환하지 않습니다. 따라서 fmt 패키지는 String() 메서드를 우리가 전달한 값과 일치시킬 수 없습니다.
대신 포인터가 아닌 개체를 전달할 때 String() 메서드를 호출하려면 값을 수동으로 변환해야 합니다. & 연산자를 사용한 포인터:
fmt.Println(&myCar)
이렇게 하면 Car 객체에 대한 포인터가 fmt.Println에 전달됩니다. 이를 통해 값 수신자 String() 메소드를 호출하고 사용자 정의 형식을 적용할 수 있습니다.
요약하자면, Stringer 인터페이스로 작업할 때 메소드가 올바른 수신자에 정의되어야 한다는 점을 기억하는 것이 중요합니다. 유형. 포인터의 경우 포인터 수신기가 적합하고 값 유형의 경우 값 수신기를 사용할 수 있습니다. 수동으로 포인터를 전달하는 것이 바람직하지 않은 경우 String() 메서드를 실제 Car 구조체의 포인터 메서드로 구현하는 것을 고려할 수 있습니다.
위 내용은 포인터가 아닌 개체를 사용할 때 `fmt.Println`이 스트링거 인터페이스 메서드를 호출하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!