golang에의 List 타입으로는 가변 길이를 지원하는 slice가 존재한다.
java의 경우 list 에서 index remove(), object remove()를 제공하지만 golang의 slice에서는 애석하게도 remove()를 직접 구현해주어야 한다.
가장 간단한 방법은 append()를 이용하는 방법이 있다.
아래와 같이 지우고자하는 index에 다음 index 부터의 값들을 append 해버리는 개념이다.
ex01) slice element delete example using append()
slice := []int{1, 2, 3, 4, 5, 6, 7}
fmt.Println(slice) //for debug
slice = append(slice[0:], slice[1:]...}
fmt.Println(slice) //for debug
ex01) output
//append 전
[1 2 3 4 5 6 7]
//append 후
[2 3 4 5 6 7]
사실 위 개념은 매우 간단하고 가장 많이 사용된다. 성능도 나쁘지 않다. 개인적으로 가장 많이 사용하고 있는 코드이다.
두 번째로는 copy()를 이용하는 것이다.
지우고자 하는 index에 다음 Index부터의 값들을 copy하는 것이다. 다만 이 경우 가장 마지막 인덱스의 값이 유지되기 때문에 반드시 slice의 마지막 element를 truncate 해야한다.
ex02) slice element delete example using copy()
slice := []int{1, 2, 3, 4, 5, 6, 7}
fmt.Println(slice)
copy(slice[0:], slice[1:])
fmt.Println(slice)
slice = slice[:len(slice)-1]
fmt.Println(slice)
ex02) output
// befor copy
[1 2 3 4 5 6 7]
// after copy
[2 3 4 5 6 7 7]
// last element truncate
[2 3 4 5 6 7]
두가지 방식 모두 성능상의 큰 차이는 없다. Benchmark 테스트 결과 성능을 비교하는 것은 의미가 없었다.
append() vs copy()
cpu: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
BenchmarkAppendDelete-16 249203800 4.661 ns/op
BenchmarkCopyDelete-16 256390916 4.675 ns/op
PASS
cpu: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
BenchmarkAppendDelete-16 259005008 4.653 ns/op
BenchmarkCopyDelete-16 260593094 4.653 ns/op
PASS
cpu: Intel(R) Core(TM) i9-9980HK CPU @ 2.40GHz
BenchmarkAppendDelete-16 264225115 4.464 ns/op
BenchmarkCopyDelete-16 270314674 4.461 ns/op
PASS
다만 copy() 의 경우 마지막 element를 수동으로 삭제해야하기 때문에 번거로움이 있는 것은 확실하다.
그래서 나는 주로 사용성이 좋은 append()를 이용하여 element를 삭제한다.
'golang (go)' 카테고리의 다른 글
golang - const와 iota로 enum(열거)형 구현하기 (1) | 2023.11.18 |
---|---|
golang byte slice (array) compare (0) | 2023.02.07 |
golang type conversion [string(val)], type assertion [val.(string)] (0) | 2023.02.03 |
golang random UUID (0) | 2022.12.04 |
golang download & install (MAC) (0) | 2022.10.10 |
댓글