본문 바로가기
golang (go)

golang slice or array element(item) remove (delete)

by first author 2023. 1. 16.
728x90
반응형

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를 삭제한다. 

 

2022.12.04 - [golang (go)] - golang random UUID

 

golang random UUID

golang 기본 함수에서는 UUID 관련 패키지를 제공하지 않습니다. 하지만 다행이도 google에서 golang용 uuid 패키지(https://github.com/google/uuid)를 github를 통해 제공하고 있네요. 이쯤이면 golang 기본 함수로

takeanoteof.tistory.com

728x90
반응형

댓글