map은 Go의 내장 해시 테이블입니다 — 평균 O(1) 조회를 갖는 순서 없는 키-값 쌍 컬렉션입니다. 키를 값에 연결하는 표준적인 방법입니다.
map 생성과 사용
go
ages := ([])
ages[] =
age := ages[]
scores := []{
: ,
: ,
}
(scores, )
(scores)
// ⚠️ 없는 키는 오류가 아니라 제로값을 반환
value := scores["missing"] // 0 — 그런데 0으로 저장된 건가, 없는 건가? 모호함!
// ✅ comma-ok 형태가 키 존재 여부를 알려줌
value, ok := scores["missing"]
if ok {
fmt.Println("found:", value)
} else {
fmt.Println("not present") // 키가 존재하지 않음
}
이는 필수적입니다: 없는 키에 접근하면 값 타입의 제로값(0, "", nil)을 반환하므로, 값만으로는 "키 없음"과 "제로값을 가진 키 존재"를 구별할 수 없습니다 — , ok 불리언이 이를 명확히 해줍니다.
for key, value := range scores {
fmt.Println(key, value)
}
// ⚠️ 반복 순서는 무작위화됨 — map 순서에 절대 의존하지 말 것!
// 순서대로 반복하려면: 키를 slice로 모아 정렬한 뒤 반복.
Go는 의도적으로 map 반복 순서를 무작위화합니다(코드가 이에 의존하지 못하게). 순서대로 반복하려면 직접 키를 정렬하세요.
var m map[string]int // nil map(선언만 하고 초기화 안 함)
v := m["x"] // ✅ 읽기는 OK → 0
m["x"] = 1 // 💥 PANIC: nil map의 항목에 할당
// 먼저 초기화해야 함: m = make(map[string]int)
nil map은 읽을 수 있지만 쓰기 시 panic입니다 — 저장 전에 make()하거나 리터럴을 사용해야 합니다.
유효한 키: 비교 가능한 타입(string, int, bool, 비교 가능한 필드의 구조체, 포인터)
무효한 키: slice, map, 함수(비교 불가) → 컴파일 오류
map은 키-값 연결과 빠른 조회(캐시, 인덱스, 카운팅, 그룹화)를 위해 끊임없이 쓰이는 기본 Go 자료구조입니다.
몇 가지 동작은 반드시 알아야 하며 흔한 버그 원인입니다: comma-ok 관용구(없는 키가 제로값을 반환하므로 키 존재를 확인하는 유일하게 신뢰할 수 있는 방법), 무작위화된 반복 순서(절대 의존하지 말 것 — 순서가 필요하면 키 정렬), nil-map 쓰기 panic(쓰기 전에 항상 초기화).
이것들을 — 그리고 키가 비교 가능한 타입이어야 한다는 점을 — 이해하는 것은 올바른 일상 Go에 필요하며, 견고한 Go 개발자를 구분 짓고 면접에 자주 등장하는 실무적 세부 사항을 반영합니다.