Golang에서 슬라이스 다시 슬라이싱
Go에서 슬라이스는 요소 컬렉션을 관리하는 유연한 방법을 제공합니다. 슬라이스를 생성하고 액세스하는 것은 간단하지만 다시 슬라이스하는 동작을 이해하는 것은 까다로울 수 있습니다. 이 개념을 설명하는 코드 조각을 살펴보겠습니다.
package main import "fmt" func main() { a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[:2] printSlice("c", c) d := c[2:5] printSlice("d", d) } func printSlice(s string, x []int) { fmt.Printf("%s len=%d cap=%d %v\n", s, len(x), cap(x), x) }
이 코드는 길이가 5이고 용량이 5인 슬라이스 a를 생성한 다음 길이와 용량이 0과 용량이 2개의 슬라이스 b와 c를 생성합니다. 각각 2개. 그런 다음 슬라이스 d는 시작 인덱스가 2이고 끝 인덱스가 5인 c의 재슬라이스로 생성됩니다.
출력을 관찰할 때 혼란스러운 부분이 발생합니다.
a len=5 cap=5 [0 0 0 0 0] b len=0 cap=5 [] c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead d len=3 cap=3 [0 0 0]
재슬라이싱 이해
슬라이스를 다시 슬라이싱할 때 다음 사항을 기억하는 것이 중요합니다. 슬라이스는 기본 배열의 사본이 아닙니다. 대신 배열의 일부를 참조하는 창입니다.
추가 설명
다음 코드는 다시 슬라이스된 항목 간의 긴밀한 관계를 예시합니다. Slices:
func main() { b := make([]int, 0, 5) c := b[:2] d := c[1:5] // this is equivalent to d := b[1:5] d[0] = 1 printSlice("c", c) printSlice("d", d) }
출력:
c len=2 cap=5 [0 1] // modifying d has modified c d len=4 cap=4 [1 0 0 0]
이는 슬라이스 d의 요소를 수정하면 슬라이스 c의 요소에 직접 영향을 미쳐 두 슬라이스가 공유함을 확인하는 것을 보여줍니다. 동일한 기본 데이터.
위 내용은 Go 슬라이스를 다시 슬라이스해도 항상 용량이 줄어들지는 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!