>백엔드 개발 >Golang >포인터가 아닌 개체를 사용할 때 `fmt.Println`이 스트링거 인터페이스 메서드를 호출하지 않는 이유는 무엇입니까?

포인터가 아닌 개체를 사용할 때 `fmt.Println`이 스트링거 인터페이스 메서드를 호출하지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-06 08:51:18523검색

Why Doesn't `fmt.Println` Call My Stringer Interface Method When Using a Non-Pointer Object?

fmt.Println을 사용할 때 내 Stringer 인터페이스 메서드가 호출되지 않는 이유는 무엇입니까?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.