> 백엔드 개발 > Golang > 메소드에 포인터 수신기가 있는 경우 Go는 객체 수신기와의 메소드 호출을 어떻게 처리합니까?

메소드에 포인터 수신기가 있는 경우 Go는 객체 수신기와의 메소드 호출을 어떻게 처리합니까?

Mary-Kate Olsen
풀어 주다: 2024-12-23 18:47:12
원래의
448명이 탐색했습니다.

How Does Go Handle Method Calls with Object Receivers When the Method Has a Pointer Receiver?

객체 대 포인터 수신기를 사용한 메서드 호출

Go에서는 값 수신기(비포인터) 또는 포인터가 있는 유형에 대해 메서드를 정의할 수 있습니다. 수신기(포인터). 객체가 포인터 수신기를 사용하여 메서드를 호출하면 Go는 호출이 객체에 대한 포인터에서 이루어진 것처럼 자동으로 해석합니다.

예를 들어 다음 코드를 고려하세요.

package main

import (
    "fmt"
    "math"
)

type Vertex struct {
    X, Y float64
}

func (v Vertex) Abs() float64 {
    return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

func (v *Vertex) Scale(f float64) {
    v.X = v.X * f
    v.Y = v.Y * f
}

func main() {
    v := Vertex{3, 4}
    v.Scale(10) // Calling a method with a pointer receiver using an object
    fmt.Println(v.Abs())
}
로그인 후 복사

여기에는 값 및 포인터 수신 방법이 모두 포함된 Vertex 유형이 있습니다. 기본 함수에서는 Vertex 객체 v를 생성한 다음 해당 객체에 대해 Scale 메서드를 호출합니다. 일반적으로 Scale 메서드는 포인터 수신기를 기대하지만 이 경우에는 개체를 사용하고 있습니다.

컴파일러는 v가 주소 지정 가능하고 해당 메서드 세트에 Scale이 포함되어 있음을 확인합니다. Go 사양에 따르면:

"x의 메소드 세트(유형)에 m이 포함되고 인수 목록이 m의 매개변수 목록에 할당될 수 있는 경우 x.m() 메소드 호출이 유효합니다. x 주소 지정이 가능하고 &x의 메서드 세트에 m이 포함되어 있습니다. x.m()은 (&x).m()의 약어입니다."

따라서 v.Scale(10) 호출이 해석됩니다. (&v).Scale(10)과 같이 v 개체에 대한 포인터를 Scale 메서드에 효과적으로 전달합니다. 이를 통해 메서드가 개체의 X 및 Y 필드를 예상대로 수정할 수 있습니다.

위 내용은 메소드에 포인터 수신기가 있는 경우 Go는 객체 수신기와의 메소드 호출을 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿