PHpullh
학습 라이브러리/Go/맵 — map[K]V

GO · 컬렉션

맵 — map[K]V

Go의 해시맵. 키-값 저장소로 동시성에서는 주의가 필요합니다.

컬렉션입문mapmakedeletecomma-ok해시맵

핵심 설명

Go의 해시맵. 키-값 저장소로 동시성에서는 주의가 필요합니다.

Go code

package main

import (
	"fmt"
	"sort"
)

func main() {
	// 맵 생성
	m1 := map[string]int{
		"apple":  5,
		"banana": 3,
		"cherry": 8,
	}
	m2 := make(map[string]int)       // 빈 맵
	m2["key"] = 100

	// 읽기 & 존재 확인 (comma-ok 패턴)
	val, ok := m1["apple"]
	if ok {
		fmt.Println("apple:", val)
	}

	val2 := m1["durian"] // 없으면 zero value (0)
	fmt.Println("durian:", val2)

	// 삭제
	delete(m1, "banana")

	// 순회 (순서 보장 안 됨)
	keys := make([]string, 0, len(m1))
	for k := range m1 { keys = append(keys, k) }
	sort.Strings(keys) // 정렬
	for _, k := range keys {
		fmt.Printf("%s: %d
", k, m1[k])
	}

	// 중첩 맵
	graph := map[string][]string{
		"A": {"B", "C"},
		"B": {"D"},
		"C": {"D", "E"},
	}
	fmt.Println(graph["A"])

	// 빈도 카운팅 패턴
	words := []string{"go", "is", "great", "go", "is"}
	freq := make(map[string]int)
	for _, w := range words { freq[w]++ }
	fmt.Println(freq)

	// 구조체를 값으로
	type Point struct{ X, Y int }
	points := map[string]Point{
		"origin": {0, 0},
		"unit":   {1, 1},
	}
	fmt.Println(points["unit"])
}

학습 팁

맵에 nil 맵에 쓰기(var m map[string]int; m["key"] = 1)는 런타임 패닉입니다. 항상 make()나 리터럴로 초기화하세요.

주의할 점

맵은 동시 읽기는 안전하지만 동시 쓰기는 race condition입니다. 고루틴에서 맵을 공유하려면 sync.RWMutexsync.Map을 사용하세요.

자주 묻는 질문

맵 — map[K]V란 무엇인가요?

Go의 해시맵. 키-값 저장소로 동시성에서는 주의가 필요합니다.

맵 — map[K]V 학습 시 주의할 점은 무엇인가요?

맵은 동시 읽기는 안전하지만 동시 쓰기는 race condition입니다. 고루틴에서 맵을 공유하려면 sync.RWMutex 나 sync.Map 을 사용하세요.