>백엔드 개발 >Golang >fmt.Println이 포인터에 대해서는 Car.String()을 호출하지만 값은 호출하지 않는 이유는 무엇입니까?

fmt.Println이 포인터에 대해서는 Car.String()을 호출하지만 값은 호출하지 않는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-07 06:42:14401검색

Why Does fmt.Println Invoke Car.String() for Pointers but Not Values?

fmt.Println을 사용하여 객체를 인쇄하기 위해 호출된 String()

fmt.Println 및 Stringer 인터페이스를 다룰 때 유형 변환 프로세스 이해

제공된 코드에서는 처리 시 Car.String()이 호출됩니다. 포인터는 있지만 값을 사용할 때는 그렇지 않습니다. 이는 fmt.Println이 포인터와 값을 모두 인터페이스 유형으로 강제 변환하기 때문입니다.

그런 다음 fmt는 유형 전환을 수행하여 값을 인쇄하는 방법을 결정합니다. fmt.Stringer(문자열을 반환하는 String 메서드 포함)를 구현하는 값의 경우 해당 메서드의 결과를 인쇄합니다. 그러나 포인터 유형에 정의된 String 메소드가 있는 값의 경우 유형 전환이 실패합니다.

해결 방법:

이 문제를 해결하려면 Car 유형에 String을 구현하거나 또는 아래와 같이 fmt.Println에 포인터를 전달합니다.

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) // Passing the pointer explicitly
}

또는 사용자 정의 유형 어설션을 사용할 수 있습니다. String을 수동으로 호출할 수 있지만 이 접근 방식은 권장되지 않습니다.

func main() {
    myCar := Car{year: 1996, make: "Toyota"}
    if v, ok := myCar.(fmt.Stringer); ok {
        fmt.Println(v.String()) // Manually invoking String
    }
}

fmt.Println의 유형 변환 동작을 처리하면 값이나 포인터 특성에 관계없이 객체의 형식이 지정되는 방식을 효과적으로 제어할 수 있습니다.

위 내용은 fmt.Println이 포인터에 대해서는 Car.String()을 호출하지만 값은 호출하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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