Go Tour의 "Slice the Slice" 섹션에서는 겉보기에 수수께끼 같은 변형이 발생합니다. 처음 두 값을 삭제하여 조각을 수정하면 용량이 6에서 4로 변경됩니다. 이 동작은 용량이 일정하게 유지되어야 한다는 초기 가정과 모순됩니다. 이러한 변경의 이유를 더 자세히 살펴보겠습니다.
슬라이스 용량 이해
Go의 슬라이스는 배열에 대한 추상화를 제공하는 데이터 구조입니다. 기본 배열의 요소를 참조하지만 지원 스토리지를 소유하지는 않습니다. 반면 용량은 슬라이스 요소를 담을 수 있는 기본 배열의 크기를 나타냅니다.
용량 감소의 원인
처음부터 요소 삭제 슬라이스는 슬라이스 데이터 포인터를 기본 배열 내에서 오른쪽으로 이동합니다. 결과적으로 슬라이스의 현재 데이터 포인터와 배열 끝 사이의 거리가 감소합니다. 이러한 감소는 용량 감소로 나타납니다.
마지막 수정만 용량에 영향을 미치는 이유
슬라이싱의 길이를 0으로 만들고 확장하는 등의 다른 작업 길이에 관계없이 슬라이스 데이터 포인터를 수정하지 마세요. 이는 슬라이스의 길이만 변경하며 데이터 포인터와 배열 끝 사이의 거리에는 영향을 주지 않습니다. 따라서 용량은 변경되지 않습니다.
내부 슬라이스 세부 정보
더 깊은 이해를 돕기 위해 리플렉션을 사용하여 슬라이스 헤더를 인쇄할 수 있습니다.
<code class="go">func printSlice(s []int) { sh := (*reflect.SliceHeader)(unsafe.Pointer(&s)) fmt.Printf("header=%+v len=%d cap=%d %v\n", sh, len(s), cap(s), s) }</code>
다음 출력은 수정이 수행됨에 따라 슬라이스 헤더의 변경 사항을 보여줍니다.
<code class="text">header=&{Data:272990208 Len:6 Cap:6} len=6 cap=6 [2 3 5 7 11 13] header=&{Data:272990208 Len:0 Cap:6} len=0 cap=6 [] header=&{Data:272990208 Len:4 Cap:6} len=4 cap=6 [2 3 5 7] header=&{Data:272990216 Len:2 Cap:4} len=2 cap=4 [5 7]</code>
As 보시다시피, 최종 수정으로 인해 데이터 포인터가 이동하여 용량이 줄어듭니다.
요약
슬라이스 용량은 요소가 처음부터 삭제될 때 변경될 수 있습니다. 일부분. 이는 슬라이스 데이터 포인터와 기본 배열 끝 사이의 거리를 줄이기 때문입니다. 길이를 0으로 슬라이싱하거나 길이를 확장하는 등의 기타 슬라이스 작업은 용량에 영향을 주지 않습니다. Go 슬라이스를 효과적으로 사용하려면 이러한 개념을 이해하는 것이 중요합니다.
위 내용은 슬라이스 시작 부분에 요소를 삭제하면 용량이 감소하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!