>백엔드 개발 >Golang >Go에서 포인터가 아닌 값에 대해 포인터 메서드를 호출할 수 있나요?

Go에서 포인터가 아닌 값에 대해 포인터 메서드를 호출할 수 있나요?

Patricia Arquette
Patricia Arquette원래의
2024-12-19 22:24:13544검색

Can Pointer Methods Be Called on Non-Pointer Values in Go?

포인터가 아닌 유형의 포인터 메서드

이전 질문에 대한 응답에서는 포인터 메서드가 포인터에서만 호출될 수 있다고 명시되어 있습니다. 그러나 이는 포인터가 아닌 값에서 포인터 메서드를 성공적으로 호출하는 다음 코드에서 알 수 있듯이 잘못된 것 같습니다.

package main

import "fmt"

type car struct {
    wheels int
}

func (c *car) fourWheels() {
    c.wheels = 4
}

func main() {
    var c = car{}
    fmt.Println("Wheels:", c.wheels)
    c.fourWheels()
    fmt.Println("Wheels:", c.wheels)
}

설명

The 이 동작을 이해하는 열쇠는 메소드 수신자가 포인터라는 사실에 있습니다. c.fourWheels()를 호출할 때 수신자 값 c는 포인터가 아닙니다. 그러나 수신자 유형이 포인터이므로 이는 (&c).fourWheels()의 약칭으로 해석됩니다.

Go 사양에 따르면 메서드를 호출할 때 수신자 값이 주소 지정 가능하고 수신자 유형이 포인터인 경우 메서드 호출은 포인터 메서드 호출로 해석됩니다. 우리의 경우 수신자 값 c는 주소 지정이 가능하고 수신자 유형 *car는 포인터이므로 c.fourWheels() 메서드 호출은 효과적으로 (&c).fourWheels()를 호출합니다.

이 동작은 다음과 같습니다. 값 메서드는 포인터와 값에 대해 호출할 수 있는 반면 포인터 메서드는 포인터에서만 호출할 수 있다는 설명과 일치합니다. 포인터 메소드의 경우 수신자 값이 포인터가 아닌 경우, 수신자로 사용할 수 있는 포인터 값을 얻기 위해서는 역참조를 해야 합니다.

위 내용은 Go에서 포인터가 아닌 값에 대해 포인터 메서드를 호출할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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