> 백엔드 개발 > Golang > Go 슬라이스를 다시 슬라이스하면 예기치 않은 용량 값이 발생하는 이유는 무엇입니까?

Go 슬라이스를 다시 슬라이스하면 예기치 않은 용량 값이 발생하는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-24 10:44:13
원래의
656명이 탐색했습니다.

Why Does Re-Slicing a Go Slice Result in Unexpected Capacity Values?

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

슬라이스의 동작을 이해하는 것은 혼란스러울 수 있으며, 특히 다시 슬라이싱과 관련된 경우 더욱 그렇습니다. 이 스니펫에서:

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

출력에 예상치 못한 결과가 나타납니다.

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
c len=2 cap=5 [0 0] 
d len=3 cap=3 [0 0 0]
로그인 후 복사

c의 용량이 2가 아닌 5인 이유는 무엇입니까? 이에 답하려면 Golang의 슬라이스 개념을 이해해야 합니다.

슬라이스(Slice)는 배열에 대한 경량 참조입니다. 슬라이스를 생성할 때 참조된 배열의 시작 및 끝 인덱스를 지정하기 위해 범위 연산(예: [:2])을 제공합니다. 그러나 이 범위 작업은 기본 배열의 복사본을 생성하지 않습니다. 대신 동일한 기본 데이터를 공유하는 새 슬라이스를 생성합니다.

주어진 예에서 b는 용량이 5인 빈 슬라이스입니다. 범위가 [인 b의 슬라이스로 c를 생성하면 :2], 우리는 본질적으로 b의 처음 두 요소에 대한 참조를 생성합니다. b의 용량은 5이므로 현재 2개의 요소만 참조하더라도 c는 잠재적으로 최대 5개의 요소를 포함하도록 확장될 수 있습니다. 이것이 c의 길이가 2임에도 불구하고 용량이 5인 이유입니다.

게다가 d를 [2:5] 범위의 c 슬라이스로 생성하면 공유하는 슬라이스를 효과적으로 생성하는 것입니다. b와 동일한 기본 데이터이지만 인덱스 2부터 시작하여 인덱스 5까지 확장됩니다. b의 용량은 5이므로 d의 용량은 3(5-2)입니다.

The 다음 프로그램은 이 동작을 더 명확하게 보여줍니다.

func main() {
    b := make([]int, 0, 5)
    c := b[:2]
    d := c[1:5] // 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도 수정되어 c와 d가 모두 창 위에 있음을 보여줍니다. 동일한 기본 배열, b.

위 내용은 Go 슬라이스를 다시 슬라이스하면 예기치 않은 용량 값이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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