슬라이싱: Go의 범위를 벗어난 오류
Go에서 슬라이싱에는 기존 슬라이스의 일부를 추출하여 새 슬라이스를 만드는 작업이 포함됩니다. 일부분. 슬라이싱 중에 범위를 벗어난 오류가 발생하면 지정된 범위가 소스 조각에 대한 유효한 인덱스 경계를 초과했음을 나타냅니다.
다음 코드 조각을 고려하세요.
a := make([]int, 5) printSlice("a", a) b := make([]int, 0, 5) printSlice("b", b) c := b[1:] printSlice("c", c)
}
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 [] panic: runtime error: slice bounds out of range goroutine 1 [running]: main.main() /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10 0x150
이 오류가 발생하는 이유를 이해하려면 Go에서 슬라이싱을 관리하는 규칙을 자세히 조사해야 합니다.
슬라이싱 규칙
슬라이스나 배열을 분할할 때 지정된 인덱스는 명시적이거나 암시적일 수 있습니다. 인덱스가 명시적으로 제공되지 않으면 기본값은 특정 값입니다. 슬라이스의 경우:
주어진 코드에서 오류가 발생하는 이유는 c 슬라이스를 생성하기 위한 슬라이싱 표현식 때문입니다. is:
c := b[1:]
이는 하한(1)이 명시적으로 지정되지만 상한은 지정되지 않음을 의미합니다. 따라서 기본값은 0인 len(b)입니다. 그러나 지정된 하한(1)은 상한(0)보다 작거나 같아해야 합니다. 이 조건이 충족되지 않아 범위를 벗어난 오류가 발생합니다.
이 오류를 방지하려면 하한과 상한을 모두 명시적으로 지정할 수 있습니다. 예를 들어, b 슬라이스에서 두 번째 요소만 추출하려면 다음과 같이 작성합니다.
c := b[1:2] // c len=1 cap=4 [0]
또는 두 번째 요소부터 시작하여 전체 b 슬라이스를 추출하려면 다음을 사용할 수 있습니다.
c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3