슬라이스 용량 변경: 첫 번째 항목과 마지막 항목 삭제의 차이
Go의 슬라이스 기능을 탐색하는 동안 일반적인 질문이 발생합니다. 처음 n개 항목을 삭제할 때와 마지막 n개 항목을 삭제할 때 용량이 다르게 동작합니까?
이 질문에 답하려면 Go 슬라이스의 구조가 다음과 같다는 점을 이해하는 것이 중요합니다.
type slice struct { array unsafe.Pointer len int cap int }
마지막 n 항목 삭제
슬라이스에서 마지막 n 항목을 제거할 때(예: s = s[:len(s)-2]) 슬라이스의 데이터는 여전히 기본 배열에 저장됩니다. . len 필드는 슬라이스의 새로운 길이를 반영하도록 업데이트되는 반면, cap 필드는 변경되지 않습니다. 이렇게 하면 슬라이스에 대해 동일한 배열 할당이 유지됩니다.
처음 n개 항목 삭제
그러나 처음 n개 항목이 삭제되는 경우(예: s = s[2: ]), 슬라이스의 기본 데이터를 동일한 배열의 다른 부분으로 이동해야 합니다. 이는 처음 n개 요소의 원래 메모리 위치가 더 이상 유효하지 않기 때문입니다. 결과적으로, len 및 cap 필드를 모두 조정하여 다른 배열 포인터를 사용하여 새 슬라이스가 생성됩니다.
이를 설명하기 위해 기본 배열에 대한 포인터를 표시하도록 printSlice 함수를 향상해 보겠습니다.
<code class="go">func printSlice(s []int) { var ptr *int if cap(s) >= 1 { ptr = &s[:cap(s)][0] } fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s) }</code>
이 수정된 코드를 실행하면 슬라이싱 작업이 포인터, 길이 및 용량을 어떻게 변경하는지 보여주고 위에서 설명한 동작을 확인합니다.
위 내용은 첫 번째 슬라이스 요소를 삭제하면 용량이 변경되지만 마지막 요소를 삭제하면 용량이 변경되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!