주소 연산자
주소 연산자
&와 * 연산자가 LoGo에서 어떻게 동작하는지 살펴볼게요. 주소를 다루는 연산자는 Go 포인터의 핵심이니, 이번 섹션에서 그 규칙을 차근차근 정리해요.
출처: Go Specification
본문
타입 T를 가진 피연산자 x에 대해, 주소 연산 &x는 x를 가리키는 타입 *T의 포인터를 생성해요. 이때 피연산자는 주소 지정 가능(addressable) 상태여야 해요. 즉, 변수이거나, 포인터 간접 참조이거나, 슬라이스 인덱싱 연산이거나, 주소 지정 가능한 구조체 피연산자의 필드 선택자이거나, 주소 지정 가능한 배열의 배열 인덱싱 연산이어야 해요.
이 주소 지정 가능 요구 사항에는 예외가 있는데, x가 (괄호로 감싸진 것도 포함해서) 합성 리터럴(composite literal)일 수도 있어요.
만약 x의 평가가 런타임 패닉(run-time panic)을 일으킨다면, &x의 평가도 마찬가지로 패닉을 일으켜요.
포인터 타입 *T를 가진 피연산자 x에 대해, 포인터 간접 참조 *x는 x가 가리키는 타입 T의 변수(variable)를 나타내요. 만약 x가 nil이라면, *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 포인터를 역참조하면 패닉이 나는 점을 기억해 주세요.
더 알아보기
- 합성 리터럴 (Composite literals): 주소 지정 가능 예외의 대상이 되는 리터럴 문법이에요.
- 변수 (Variables):
*x가 나타내는 변수의 정의를 다뤄요. - 런타임 패닉 (Run-time panics): 잘못된 평가가 어떤 시점에 패닉으로 이어지는지 확인해요.