주소 연산자

주소 연산자

&* 연산자가 LoGo에서 어떻게 동작하는지 살펴볼게요. 주소를 다루는 연산자는 Go 포인터의 핵심이니, 이번 섹션에서 그 규칙을 차근차근 정리해요.

출처: Go Specification

본문

타입 T를 가진 피연산자 x에 대해, 주소 연산 &xx를 가리키는 타입 *T의 포인터를 생성해요. 이때 피연산자는 주소 지정 가능(addressable) 상태여야 해요. 즉, 변수이거나, 포인터 간접 참조이거나, 슬라이스 인덱싱 연산이거나, 주소 지정 가능한 구조체 피연산자의 필드 선택자이거나, 주소 지정 가능한 배열의 배열 인덱싱 연산이어야 해요.

이 주소 지정 가능 요구 사항에는 예외가 있는데, x가 (괄호로 감싸진 것도 포함해서) 합성 리터럴(composite literal)일 수도 있어요.

만약 x의 평가가 런타임 패닉(run-time panic)을 일으킨다면, &x의 평가도 마찬가지로 패닉을 일으켜요.

포인터 타입 *T를 가진 피연산자 x에 대해, 포인터 간접 참조 *xx가 가리키는 타입 T변수(variable)를 나타내요. 만약 xnil이라면, *x를 평가하려는 시도는 런타임 패닉을 일으켜요.

예시를 함께 볼게요.

&x
&a[f(2)]
&Point{2, 3}
*p
*pf(x)

var x *int = nil
*x   // causes a run-time panic
&*x  // causes a run-time panic

&Point{2, 3}처럼 합성 리터럴에는 주소 연산을 바로 적용할 수 있고, *x처럼 nil 포인터를 역참조하면 패닉이 나는 점을 기억해 주세요.

더 알아보기