-
golang: sliceGo lang 실습 2021. 8. 8. 23:41반응형
슬라이스는 간단해 보이지만
c언어의 포인터 개념이 없다면 꽤 헛갈릴 수도 있을 것 같다.package main import "fmt" func main() { nums := []int{1, 2, 3, 4, 5} slice1 := nums[:4] fmt.Println(slice1) // [1,2,3,4] slice1[3] = 6 fmt.Println(slice1) // [1,2,3,6] fmt.Println(nums) // [1,2,3,6,5] slice1 = append(slice1, 0) fmt.Println(slice1) // [1,2,3,6,0] fmt.Println(nums) // [1,2,3,6,0] }
상식적이다.
1~5까지 nums 슬라이스를 만들고,
이중에 4개만 slice1이 '참조(같은 곳을 바라봄)'하도록 만들고..
(여기까지 nums의 내용은 그대로다.)여기서 slice1의 3번 (0번 부터 시작했으니 4번째 원소)를 6으로 바꾸니까...
nums의 3번도 6으로 바뀐다.
참조를 했을 뿐이니 당연한 결과이다.여기에 slice1에 0을 추가하고... 즉 5번째 원소가 0이 됨.
nums의 5번째 원소도 0이 된다.
역시 참조 관계를 생각하면 당연한 결과이다.하지만...
package main import "fmt" func main() { nums := []int{1, 2, 3, 4, 5} slice1 := nums[:4] fmt.Println(slice1) // [1,2,3,4] slice1[3] = 6 fmt.Println(slice1) // [1,2,3,6] fmt.Println(nums) // [1,2,3,6,5] slice1 = append(slice1, 0, 9) fmt.Println(slice1) // [1 2 3 6 0 9] fmt.Println(nums) // [1,2,3,6,5] }
slice1에 0, 9를 추가하면
마지막 fmt.Println(nums) 의 결과가 달라진다.슬라이스란 배열의 포인터에 길이, 용량이 추가된 구조체 라고 볼 수 있다.
cap(용량)의 개념이 있어야 하는데...
cap를 넘어서면 공간 부족 때문에
새로운 배열을 만들고 바라보게(참조하게) 된다.아래 처럼 캡을 넉넉하게 만들어 주면....
package main import "fmt" func main() { nums := make([]int, 5, 6) nums[0] = 1 nums[1] = 2 nums[2] = 3 nums[3] = 4 nums[4] = 5 slice1 := nums[:4] fmt.Println(slice1) // [1,2,3,4] slice1[3] = 6 fmt.Println(slice1) // [1,2,3,6] fmt.Println(nums) // [1,2,3,6,5] slice1 = append(slice1, 0, 9) fmt.Println(slice1) // [1,2,3,6,0,9] fmt.Println(nums) // [1,2,3,6,0] }
위 코드보단 아래 쪽이 깔끔한 것 같아서...
package main import "fmt" func main() { nums := make([]int, 5, 6) nums = append([]int{}, 1, 2, 3, 4, 5) slice1 := nums[:4] fmt.Println(slice1) // [1,2,3,4] slice1[3] = 6 fmt.Println(slice1) // [1,2,3,6] fmt.Println(nums) // [1,2,3,6,5] slice1 = append(slice1, 0, 9) fmt.Println(slice1) // [1,2,3,6,0,9] fmt.Println(nums) // [1,2,3,6,0] }
반응형