IT/Go

[Go/Golang] Go Slice에서 중복 제거 하기(struct 활용)

wookiist 2021. 2. 14. 19:13

Python에서 중복을 제거할 땐 원소의 위치가 중요하지 않다면, 셋으로 변환한 후, 다시 리스트로 변환해주면 중복을 제거할 수 있다.

Go에서는 이런 트릭은 따로 존재하지 않는다. 따라서 직접 로직을 구현해야 한다. (요즘 Go에 푹 빠져서 살고 있는데, 이런 점이 매력인 것 같다)

아래는 String 타입의 Slice에서 중복을 제거하는 코드이다. 다른 자료형의 Slice라면 해당 자료형에 알맞은 코드를 구현하면 된다.

func makeSliceUnique(s []string) []string {
    keys := make(map[string]struct{}) 
    res := make([]string, 0) 
    for _, val := range s { 
        if _, ok := keys[val]; ok { 
            continue 
        } else { 
            keys[val] = struct{}{} 
            res = append(res, val) 
        } 
    }
    return res 
}

Go의 Slice에서 중복을 제거할 땐, 보통 map을 이용한다.

처음 마주치는 item을 map에 넣고, 후에 다시 마주치는 경우, 해당 item을 skip하는 방식이다.

이 때, map의 value 타입을 bool을 사용하지 않고 struct{} 로 생성하는 점이 독특한데, 이는 Go에서 빈 구조체는 메모리를 차지하지 않는다는 점을 활용한 것이다. bool을 이용하면 기본적으로 false로 초기화 되는데, 이렇게 되면 Slice의 크기만큼 메모리를 차지하게 된다. Go에서는 빈 struct{} 를 이용하는 트릭이 종종 사용되는 것으로 보인다.

이젠 메모리를 더 아낄 수 있는 struct{}를 value로 이용해보자!

반응형