>백엔드 개발 >Golang >첫 번째 슬라이스 요소를 삭제하면 용량이 변경되지만 마지막 요소를 삭제하면 용량이 변경되지 않는 이유는 무엇입니까?

첫 번째 슬라이스 요소를 삭제하면 용량이 변경되지만 마지막 요소를 삭제하면 용량이 변경되지 않는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-02 21:58:021022검색

Why Does Dropping First Slice Elements Change Capacity, But Dropping Last Elements Doesn't?

슬라이스 용량 변경: 첫 번째 항목과 마지막 항목 삭제의 차이

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 = &amp;s[:cap(s)][0]
    }
    fmt.Printf("ptr=%p len=%d cap=%d %v\n", ptr, len(s), cap(s), s)
}</code>

이 수정된 코드를 실행하면 슬라이싱 작업이 포인터, 길이 및 용량을 어떻게 변경하는지 보여주고 위에서 설명한 동작을 확인합니다.

위 내용은 첫 번째 슬라이스 요소를 삭제하면 용량이 변경되지만 마지막 요소를 삭제하면 용량이 변경되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.