관리 메뉴

밤 늦게까지 여는 카페

Golang slices.DeleteFunc 왜 이렇게 만들었죠?? 본문

For Fun/Go-lang

Golang slices.DeleteFunc 왜 이렇게 만들었죠??

Jㅐ둥이 2024. 11. 3. 23:26
반응형

안녕하세요. 오늘은 Golang을 사용하면서 느꼈던 불편함을 공유드리려고 합니다.

 

1. slices.DeleteFunc

원래 golang은 slice(array)를 조작하는 함수를 따로 제공하지 않았습니다.

 

그래서 slices 내의 원소를 삭제하려면 코드를 다음과 같이 작성해야 했습니다.

for i:=0; i<len(arr); i++ {
    if arr[i] < 0 {
        arr = append(arr, arr[i+1:]...)
    }
}

 

  • array 데이터 타입에 대해서 기본적인 메소드를 제공해주는 프로그래밍 언어를 접해보신 분들한테는 꽤나 당혹스러우실 것 같습니다 ㅋㅋㅋ

 

하지만 2023년 2월에 배포된 golang 1.21 버전부터는 slices 패키지가 정식으로 추가되었습니다.

드디어 slice를 편하게 사용할 수 있게 되었습니다!

slices 패키지에서 사용할 수 있는 메소드들

2. 원본 데이터를 수정하는 DeleteFunc?

그런데 slices.DeleteFunc를 사용하면 원본 데이터가 수정되는 이상한 일이 일어났습니다.

 

아래 코드를 실행하면 원본 변수인 old의 데이터가 달라지는 것이죠...!

package main

import (
	"fmt"
	"slices"
)

func main() {
	old := []int{1, 2, 3, 4, -1, 5, 6}
	fmt.Println("old before delete func", old)

	del := func(v int) bool {
		return v < 0
	}
	new := slices.DeleteFunc(old, del)

	fmt.Println("old after delete func", old)
	fmt.Println("new after delete func", new)
}

old 변수가 왜 달라지는거지?

사실 slices.DeleteFunc의 공식 문서에도 적혀 있는 내용이긴 하지만... 이해가 되질 않았습니다!

원본 데이터와 새로운 데이터 사이의 인덱스를 0으로 만든다는 내용!

 

찾아보니 저처럼 생각한 분들이 더 있더라고요 ㅋㅋㅋ

 

어떤 분은 slices.DeleteFunc가 이렇게 만들어진 이유도 이해하니 설명을 바꾸자는 이슈를 만들기도 했습니다.

Delete, DeleteFunc, Replace의 설명을 바꾸자는 이슈

 

여기까지 찾아보니 틀린 것은 없고 그저 선택의 영역이란 것을 알게 되어 더 찾아보지 않게 되었습니다...

반응형