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로 이용해보자!
반응형
'IT > Go' 카테고리의 다른 글
[Go/Golang] Raw(`) string과 Interpreted(") string의 차이점을 알아보자 (0) | 2021.02.22 |
---|---|
[Go/Golang] go test 실행 시 gcc 에러가 발생하는 경우(mac, windows, linux) (0) | 2021.02.19 |
[Go/Golang] go get 과 go install 은 어떻게 다른 것일까? (0) | 2021.02.19 |
[Go/Golang] Go 1.16 부터 io/ioutil 패키지가 deprecated 됩니다. (0) | 2021.02.18 |
[Go/Golang] Go 1.16 정식 Release! Apple Silicon Mac Native 지원 (0) | 2021.02.18 |