> 백엔드 개발 > Golang > Go 슬라이스를 다시 슬라이스해도 항상 용량이 줄어들지는 않는 이유는 무엇입니까?

Go 슬라이스를 다시 슬라이스해도 항상 용량이 줄어들지는 않는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-17 02:21:24
원래의
754명이 탐색했습니다.

Why Does Re-slicing a Go Slice Not Always Reduce Its Capacity?

Golang에서 슬라이스 다시 슬라이싱

Go에서 슬라이스는 요소 컬렉션을 관리하는 유연한 방법을 제공합니다. 슬라이스를 생성하고 액세스하는 것은 간단하지만 다시 슬라이스하는 동작을 이해하는 것은 까다로울 수 있습니다. 이 개념을 설명하는 코드 조각을 살펴보겠습니다.

package main

import "fmt"

func main() {
    a := make([]int, 5)
    printSlice("a", a)
    b := make([]int, 0, 5)
    printSlice("b", b)
    c := b[:2]
    printSlice("c", c)
    d := c[2:5]
    printSlice("d", d)
}

func printSlice(s string, x []int) {
    fmt.Printf("%s len=%d cap=%d %v\n",
        s, len(x), cap(x), x)
}
로그인 후 복사

이 코드는 길이가 5이고 용량이 5인 슬라이스 a를 생성한 다음 길이와 용량이 0과 용량이 2개의 슬라이스 b와 c를 생성합니다. 각각 2개. 그런 다음 슬라이스 d는 시작 인덱스가 2이고 끝 인덱스가 5인 c의 재슬라이스로 생성됩니다.

출력을 관찰할 때 혼란스러운 부분이 발생합니다.

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0] //why the capacity of c not 2 but 5 instead
d len=3 cap=3 [0 0 0]
로그인 후 복사

재슬라이싱 이해

슬라이스를 다시 슬라이싱할 때 다음 사항을 기억하는 것이 중요합니다. 슬라이스는 기본 배열의 사본이 아닙니다. 대신 배열의 일부를 참조하는 입니다.

  • 슬라이스 c의 경우 슬라이스 b의 처음 두 요소의 슬라이스로 생성됩니다. b의 용량은 5이므로 슬라이스 c는 나머지 세 요소를 포함하도록 확장될 수 있습니다. 이것이 용량이 5로 유지되는 이유입니다.
  • 슬라이스 d는 시작 인덱스가 2인 c의 재슬라이스로 생성됩니다. 이는 d가 [2, 5). 이 범위에는 요소가 3개만 남아 있으므로 d의 길이는 3이고 용량은 3입니다(총 용량이 5인 더 큰 슬라이스의 일부이므로).

추가 설명

다음 코드는 다시 슬라이스된 항목 간의 긴밀한 관계를 예시합니다. Slices:

func main() {
    b := make([]int, 0, 5)
    c := b[:2]
    d := c[1:5] // this is equivalent to d := b[1:5]
    d[0] = 1
    printSlice("c", c)
    printSlice("d", d)
}
로그인 후 복사

출력:

c len=2 cap=5 [0 1] // modifying d has modified c
d len=4 cap=4 [1 0 0 0] 
로그인 후 복사

이는 슬라이스 d의 요소를 수정하면 슬라이스 c의 요소에 직접 영향을 미쳐 두 슬라이스가 공유함을 확인하는 것을 보여줍니다. 동일한 기본 데이터.

위 내용은 Go 슬라이스를 다시 슬라이스해도 항상 용량이 줄어들지는 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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