> 백엔드 개발 > Golang > Go 포인터: `&`(주소)와 `*`(역참조)의 차이점은 무엇입니까?

Go 포인터: `&`(주소)와 `*`(역참조)의 차이점은 무엇입니까?

Susan Sarandon
풀어 주다: 2024-12-02 18:59:09
원래의
245명이 탐색했습니다.

Go Pointers: What's the Difference Between `&` (Address-of) and `*` (Dereference)?

& 및 * 포인터

Go에서 변수를 함수 인수로 전달하면 컴파일러 오류가 발생할 수 있으며 이는 포인터를 사용하여 해결할 수 있습니다. 그러나 &와 * 포인터의 구별은 종종 혼란을 야기합니다. 이 문서의 목적은 두 포인터 유형의 차이점과 사용 시나리오를 명확히 하는 것입니다.

오류 해결

귀하의 예에서 오류는 예상 인수 유형과 실제 인수 유형 간의 불일치로 인해 발생할 수 있습니다. 변수가 전달되었습니다. Decode 함수에는 User 구조체에 대한 주소나 포인터가 필요하지만 값을 직접 전달하고 있습니다. 이 문제를 해결하려면 & 연산자를 사용하여 사용자 변수의 주소를 얻을 수 있습니다.

if err := decoder.Decode(&u); err != nil {
    http.Error(rw, "could not decode request", http.StatusBadRequest)
    return
}
로그인 후 복사

포인터 이해

포인터는 다른 변수의 주소를 보유하는 변수입니다. & 연산자는 변수의 주소를 반환하고 * 연산자를 사용하면 해당 주소의 값에 액세스할 수 있습니다.

위의 예에서 &u는 User 구조체의 주소를 제공한 다음 포인터가 필요한 함수를 디코딩합니다.

그러나 다음을 사용하여 User 인스턴스를 생성했다면

u := new(User)
로그인 후 복사

그러면 u는 이미 포인터이며 & 연산자는 필요하지 않습니다. 다음을 사용하여 명시적으로 포인터를 생성할 수도 있습니다.

var u *User
로그인 후 복사

&와 *의 차이점

&와 *의 주요 차이점은 *가 주소에 저장된 값으로의 리디렉션을 나타낸다는 것입니다. while &는 주소를 반환합니다.

예:

var y int
var pointerToY *int
var pointerToPointerToInt **int

y = 10
pointerToY = &y
pointerToPointerToInt = &pointerToY
로그인 후 복사

현재:

  • y는 값 10을 보유합니다.
  • *pointerToY y로 리디렉션하고 해당 값을 인쇄합니다. 10.
  • &y는 y의 주소를 반환합니다.
  • &pointerToY는 포인터ToY의 주소를 반환합니다.
  • &pointerToPointerToInt는 포인터ToPointerToInt의 주소를 반환합니다.
  • **pointerToPointerToInt 두 번 리디렉션하므로 값 10을 인쇄합니다. y.

사용 시나리오

&(주소 연산자):

  • 변수의 주소를 기능.
  • 에 할당하기 전에 주소를 얻으려면 포인터.
  • 두 포인터를 비교하려면.

예:

func swap(x, y *int) {
    *x, *y = *y, *x
}
로그인 후 복사

*(역참조 연산자):

  • 저장된 값에 액세스하려면 주소.
  • 포인터에 값 할당
  • 두 포인터 비교

예:

var p *int

*p = 10
로그인 후 복사

결론:

Go에서 효율적인 변수 처리와 컴파일러 오류 해결을 위해서는 & 및 포인터를 이해하는 것이 중요합니다. 주요 차이점은 의 '리디렉션' 동작에 있으며, &는 변수의 실제 주소를 반환합니다. 의도된 사용 시나리오를 신중하게 고려하면 최적의 성능과 정확성을 위해 Go 코드의 포인터를 효과적으로 활용할 수 있습니다.

위 내용은 Go 포인터: `&`(주소)와 `*`(역참조)의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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