인덱스 식
다음과 같은 형태의 기본 식은
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의 요소에 할당하면 런타임 패닉이 발생한다.