Go Tour 슬라이드 11에서 처음 두 요소를 삭제할 때 슬라이스 용량이 감소하지만 슬라이스 길이를 확장할 때는 감소하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2024-11-06 06:43:03
원래의
831명이 탐색했습니다.

Why does the slice capacity decrease when dropping the first two elements in Go Tour slide 11, but not when extending the slice length?

Go Tour의 슬라이스 용량 변경 이해 #11

Go Tour는 슬라이스를 포함한 언어 기능에 대한 통찰력 있는 데모를 제공합니다. 슬라이드 11에서는 정수 조각을 조작하여 해당 속성을 보여줍니다. 그러나 한 가지 관찰은 의문을 제기합니다. 이전 작업에서는 슬라이스 용량이 변경되지 않은 채 마지막 줄에서 왜 변경됩니까?

슬라이스 조작이 용량에 미치는 영향 이해

슬라이스 용량은 재할당이 필요하기 전에 기본 배열이 보유할 수 있는 최대 요소 수를 나타냅니다. Go Tour 코드 조각은 다음 작업을 수행합니다.

  1. 생성: 길이와 용량이 6인 초기 슬라이스 s가 생성됩니다.
  2. 길이가 0으로 슬라이싱: s[:0]은 s의 시작 부분에서 시작하여 인덱스 0에서 끝나는 새 조각을 생성하여 효과적으로 길이를 0으로 자릅니다. 백업 어레이에서 제거된 요소가 없기 때문에 용량은 6으로 유지됩니다.
  3. 슬라이스 길이 확장: s[:4]는 처음 4개 요소를 포함하도록 슬라이스를 확장합니다. 백업 배열에 여전히 공간이 있으므로 용량은 6으로 유지됩니다.
  4. 처음 두 값 삭제: s[2:]는 s의 처음 두 요소를 제거하지만 용량은 4로 감소합니다. . 이는 슬라이스가 여전히 나머지 요소를 보유하고 있고 슬라이스의 시작(s[2])과 지원 배열의 끝 사이의 거리가 줄어들었기 때문에 발생합니다.

이유 마지막 줄의 용량 감소를 위해

  • 슬라이스 데이터 포인터 이동: 처음 두 요소를 삭제하면 슬라이스 데이터 포인터가 오른쪽으로 두 위치 이동합니다. 이렇게 하면 슬라이스 시작과 백업 어레이 끝 사이의 거리가 효과적으로 줄어듭니다.
  • 백킹 어레이에 영향 없음: 모든 슬라이스 작업은 백업 어레이가 아닌 슬라이스 헤더만 수정합니다. . 백업 어레이는 변경되지 않고 6개의 용량으로 유지됩니다.

헤더 변경 시각화

다음 코드는 슬라이스 헤더를 인쇄하여 다음에 대한 추가 통찰력을 제공합니다. 변경 사항:

<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>
로그인 후 복사

출력에서는 처음 두 요소가 삭제될 때 헤더 데이터 포인터가 272990208에서 272990216으로 이동하여 슬라이스 용량이 줄어드는 것을 보여줍니다.

위 내용은 Go Tour 슬라이드 11에서 처음 두 요소를 삭제할 때 슬라이스 용량이 감소하지만 슬라이스 길이를 확장할 때는 감소하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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