728x90

slice에서 append()를 사용할 때 발생하는 문제 1

slice1 := make([]int, 3, 5)     // [0, 0, 0] len : 3, cap : 5
slice2 := append(slice1, 4, 5)  // [0, 0, 0, 4, 5] len : 5, cap : 5

slice1[1] = 100                 // slice1 : [0, 100, 0] len : 3, cap : 5
                                // slice2 : [0, 100, 0, 4, 5] len : 5, cap : 5
                    
slice1 = append(slice1, 500)    // slice1 : [0, 100, 0, 500] len : 4, cap : 5
                                // slice2 : [0, 100, 0, 500, 5] len : 5, cap : 5

append()를 이용했는데 slice1과 slice2가 같은 저장 공간을 사용하는 것 처럼 보인다.

 

slice에서 append()를 사용할 때 발생하는 문제 2

slice1 := []int{1, 2, 3}        // [1, 2, 3] len : 3, cap : 3
slice2 := append(slice1, 4, 5)  // [1, 2, 3, 4, 5] len : 5, cap : 6

slice1[1] = 100                 // slice1 : [1, 100, 3] len : 3, cap : 3
                                // slice2 : [1, 2, 3, 4, 5] len : 5, cap : 6
                    
slice1 = append(slice1, 500)    // slice1 : [1, 100, 3, 500] len : 4, cap : 6
                                // slice2 : [1, 2, 3, 4, 5] len : 5, cap : 6

append를 이용했는데 slice1과 slice2가 다른 저장 공간을 사용하는 것 처럼 보인다.

 

이 두개의 차이를 이해하려면 slice의 동작에 대해 이해를 해야한다.

문제 1의 코드를 보면 capacity 값이 2개가 남아있는 상태로 만들어졌었다. 그렇기 때문에 append()로 4,5를 추가해도 slice1의 메모리 주소가 복사되서 같은 저장 공간을 사용하는 것 처럼 보인 것이다.

즉 slice1과 slice2는 다른 저장공간을 가지고 있지만 안에 값은 포인터로 같은 곳을 가르키고 있다.

문제 2의 코드를 보면 capacity 값이 0인 상태로 append()를 했기 때문에 새로운 메모리 공간을 생성한 이후에 slice2에 저장이 되었기 때문에 slice1과 slice2는 전혀 다른 메모리 공간이 된 것이다.

즉 slice1과 slice2는 다른 저장공간을 가지고 있고 안에 값도 다른 포인터를 가르키고 있다.

 

- 출처 : Tucker의 Go 언어 프로그래밍

728x90

'Basic Programming > Golang' 카테고리의 다른 글

Golang - 슬라이스 정렬  (1) 2023.07.13
Golang - 슬라이스 요소 삭제/추가  (0) 2023.07.13
Golang - 슬라이스 복제  (0) 2023.07.13
Golang - Slicing  (0) 2023.07.13
Golang - Slice 기본 문법  (0) 2023.07.12

+ Recent posts