Go언어에서 Map은 HashTable 이며 데이터는 버킷 배열에 저장이 된다. 즉, 키(Key)에 대응하는 값(Value)을 해시테이블(Hash table)을 이용하여 look up 하는 자료구조이다. 데이터 형은 아래와 같이 "map[Key타입]Value타입" 과 같이 선언할 수 있다.
make(map[*websocket.Conn]bool)
make() 함수의 첫번째 파라미터로 map 키워드와 [키타입]값타입 을 지정하는데, 이때의 make()함수는 해시테이블 자료구조를 메모리에 생성하고 그 메모리를 가리키는 map value를 리턴한다 (map value는 내부적으로 runtime.hmap 구조체를 가리키는 포인터이다.)
* runtime.hmap
type hmap struct {
count int
flags uint8
B uint8
noverflow uint16
hash0 uint32
buckets unsafe.Pointer
oldbuckets unsafe.Pointer
nevacuate uintptr
extra *mapextra
}
데이터가 커지면 새로운 배열 (buckets) 을 생성 하며 이전 배열(oldbuckets) 에서 점진적으로 새 버킷 배열로 데이터가 복사 된다.
참고로 자바의 경우 Map은 red-black tree(자가 균형 이진탐색트리), HashMap은 HashTable 을 사용한다.
* 참고: https://go.dev/src/runtime/map.go