슬라이싱: Go의 Out-of-Bounds 오류
Go에서 슬라이싱은 기존 슬라이스의 일부를 추출하여 새로운 슬라이스를 만드는 것을 포함합니다. 일부분. 슬라이싱 중에 범위를 벗어난 오류가 발생하면 지정된 범위가 소스 슬라이스에 대한 유효한 인덱스 경계를 초과했음을 나타냅니다.
다음 코드 조각을 고려하세요.
package main</p> <p>import "fmt"</p> <p>func main() {</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">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)
}
이 코드를 실행하면 범위를 벗어납니다. error:
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]
위 내용은 Go Slicing에서 Slice Bounds Out of Range 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!