슬라이스 시작 부분에 요소를 삭제하면 용량이 감소하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-04 11:21:43
원래의
1015명이 탐색했습니다.

Why Does Dropping Elements at the Beginning of a Slice Reduce its Capacity?

Go Tour #11: 슬라이스 용량 변경의 미스터리

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!