>  기사  >  백엔드 개발  >  ## Go에서 값이 포인터 메서드를 호출할 수 있는 이유는 무엇인가요?

## Go에서 값이 포인터 메서드를 호출할 수 있는 이유는 무엇인가요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-10-25 23:58:28424검색

## Why Can a Value Invoke a Pointer Method in Go?

Go Receiver Methods Calling Syntax: A Deeper Dive

"Effective Go" 가이드에는 포인터 메서드만 사용할 수 있다고 명시되어 있습니다. 포인터에서 호출되는 반면, 값 메서드는 포인터나 값에서 호출될 수 있습니다. 그러나 최근의 만남은 다음과 같은 질문을 제기합니다. 값이 다음 코드에서 포인터 메서드를 호출하는 이유는 무엇입니까?

<code class="go">package main

import (
  "fmt"
)

type age int

func (a age) String() string {
  return fmt.Sprintf("%d yeasr(s) old", int(a))
}

func (a *age) Set(newAge int) {
  if newAge >= 0 {
    *a = age(newAge)
  }
}

func main() {
  var vAge age = 5
  pAge := new(age)
  vAge.Set(10) // Compilation successful
}</code>

이 문제를 해결하기 위해 Go 언어 사양을 참조합니다. "호출" 아래에는 다음과 같이 나와 있습니다.

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

이 경우 vAge는 주소 지정이 가능합니다(*age로의 유형 변환이 유효함). vAge.Set(10)은 본질적으로 (&vAge).Set(10)입니다. Set()의 수신자 유형이 포인터이기 때문에 vAge 값이 포인터 메서드 Set()을 호출할 수 있는 이유입니다.

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

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