인덱스 식
다음과 같은 형태의 기본 식은
a[x]
x로 인덱스된 배열, 배열 포인터, 슬라이스, 문자열, 혹은 맵인 a의 요소를 의미한다. x의 값은 해당 데이터 구조의 인덱스 혹은 맵의 키라고 부른다. 다음과 같은 규칙을 따른다:
a가 맵이 아닌 경우:
- 인덱스
x는 정수 타입이거나 미지정 타입이어야 한다;0 <= x < len(a)이 성립하면 범위 안이라고 하고, 그렇지 않으면 범위 밖이라고 한다. - 상수 인덱스는 음수일 수 없고 타입
int의 값으로 나타낸다.
배열 타입 A의 a에 대해서는:
배열 타입의 포인터인 a에 대해서는:
a[x]는(*a)[x]를 속기한 것이다.
슬라이스 타입 S의 a에 대해서는:
- 런타임에서
x가 범위 밖일 경우 런타임 패닉이 발생한다. a[x]는 인덱스x에 위치한 슬라이스 요소이고a[x]의 타입은S의 요소 타입이다.
string 타입의 a에 대해서는:
- 만약 문자열
a가 상수일 경우 상수 인덱스는 범위 안에 있어야 한다. - 런타임에서
x가 범위 밖일 경우 런타임 패닉이 발생한다. a[x]는 인덱스x에 위치한 비상수 바이트값이고a[x]의 타입은byte이다.a[x]는 새로운 값을 할당할 수 없다.
map 타입 M의 a에 대해서는:
x'의 타입은M의 키 타입에 할당 가능해야 한다.- map이 키
x로 입력된 값을 가지고 있으면,a[x]는 키x에 대한 map 값이고a[x]의 타입은M의 값 타입이다. - map이
nil이거나 해당하는 입력이 없을 때,a[x]는M의 값 타입에 맞는 제로값이다.
그 외 경우에 a[x]는 허용되지 않는다.
타입 map[K]V의 map a에 대한 인덱스 식이 할당문에 사용되거나 특별한 형식의 초기화에 사용될 경우
v, ok = a[x]
v, ok := a[x]
var v, ok = a[x]
추가적으로 미지정 타입의 불리언 값이 생성된다. 키 x가 map안에 있으면 ok의 값은 true이고 그렇지 않으면 false이다.
nil map의 요소에 할당하면 런타임 패닉이 발생한다.