> 백엔드 개발 > Golang > Go 함수 호출 결과에 대해 포인터 메서드를 호출할 수 없는 이유는 무엇입니까?

Go 함수 호출 결과에 대해 포인터 메서드를 호출할 수 없는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-19 10:08:15
원래의
997명이 탐색했습니다.

Why Can't I Call a Pointer Method on the Result of a Go Function Call?

"Cannot Take the Address Of" 및 "Cannot Call Pointer Method On" 오류 이해

Go로 작업할 때 오류가 발생할 수 있습니다. "주소를 가져올 수 없습니다" 또는 "포인터 메서드를 호출할 수 없습니다"와 같은 말은 학습하는 사람들을 혼란스럽게 합니다. 언어.

문제:

다음 Go 코드를 고려하세요.

diff := projected.Minus(c.Origin)
dir := diff.Normalize() // error: cannot call pointer method on Vector3

// Vector3 methods
func (a *Vector3) Minus(b Vector3) Vector3 { ... }
func (a *Vector3) Normalize() Vector3 { ... }
로그인 후 복사

두 번째 줄에서는 Vector3.Normalize() 때문에 컴파일 오류가 발생합니다. 포인터 수신기가 필요합니다. 즉, Vector3 대신 Vector3 값(*Vector3)에 대한 포인터가 필요합니다. value.

발생 원인:

Go에서는 함수 및 메서드 호출의 반환 값을 처리할 수 없습니다. 따라서 두 번째 예에서 컴파일러는 Vector3.Minus() 결과의 주소를 가져올 수 없으므로 해당 값에 대해 Normalize()를 호출할 수 없습니다.

가능한 해결 방법:

  • 별도 할당: 반환 값을 변수에 할당하고 해당 메서드를 호출합니다. dir = diff.Normalize()가 작동하는 첫 번째 예에서 볼 수 있듯이 변수입니다.
  • 수신기 유형 변경: 값 수신기(* 대신 Vector3)를 갖도록 Normalize() 메서드를 수정합니다. 벡터3). 이를 통해 포인터가 아닌 값에 대한 연결 메서드 호출이 가능해집니다.
  • 반환 포인터: Normalize()가 포인터(*Vector3)를 반환하도록 만들어 반환 값의 주소를 지정할 필요가 없도록 합니다.
  • 도우미 함수 만들기: 반환할 pv(v)와 같은 값의 주소를 반환하는 함수를 만듭니다. &v, 결과에 대해 Normalize()를 호출합니다.

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

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