[Go] map

Jiwoo Kim·2021년 11월 3일
0

Go

목록 보기
4/11
post-thumbnail

Go 언어에서 map은 Hash Table로 구현된다.

생성

선언

var m map[keyType]valueType
  • 변수 선언 상태만으로는 맵을 이용할 수 없다.
  • keyType은 불변 자료형이어야 한다.

초기화

m := make(map[keyType]valueType)
// or
m := map[keyType]valueType{}
  • 위 2가지 방법을 통해 빈 맵으로 초기화할 수 있다.

Operation

get

value, ok := map[key]
  • value : key가 map에 없으면 값의 자료형의 기본값을 반환한다.
  • ok : key 존재 여부를 bool값으로 반환한다.

put

map[key] = value
  • 이미 key가 map에 존재해도 value로 덮어 쓴다.

delete

delete(map, key)
  • key가 아예 삭제됨

len

len(map)
  • key 개수 반환

활용

func count(s string, codeCount map[rune]int) {
	for _, r := range s {
    	codeCount[r]++;
    }
}
  • map은 변수 자체에 값을 할당하지 않기 때문에 포인터를 취하지 않아도 내용 변경이 가능하다.
  • slice는 a = append(a, ..)와 같이 포인터를 넘긴다.

비교

codeCount := map[rune]int{}
count("가나다나", codeCount)
if !reflect.DeepEqual(map[rune]int{'가':1, '나':2, '다':3}, codeCount) {
    // not equal
}
  • reflect.DeepEqual()을 활용해야 Hash 값에 의존하지 않고 동등성을 비교할 수 있다.

중복체크

func hasDupeRune(s string) bool {
    runeSet := map[rune]struct{}{}
    for _, r := range s {
    	if _, exists := runeSet[r]; exists {
        	return true
        }
        runeSet[r] = struct{}{}
    }
    return false;
}
  • value로 빈 구조체 struct{}를 사용하면 bool을 사용할 때보다 오버헤드를 줄일 수 있다.

한계

  • 하나의 key에 여러 value 매핑 불가하다.
  • Thread-Safe 하지 않다.

0개의 댓글