"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go Slicing에서 슬라이스 경계가 범위를 벗어남 오류가 발생하는 이유는 무엇입니까?

Go Slicing에서 슬라이스 경계가 범위를 벗어남 오류가 발생하는 이유는 무엇입니까?

2024년 12월 21일에 게시됨
검색:174

Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?

슬라이싱: 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에서 슬라이싱을 관리하는 규칙을 자세히 조사해야 합니다.

슬라이싱 규칙

슬라이스나 배열을 분할할 때 지정된 인덱스는 명시적이거나 암시적일 수 있습니다. 인덱스가 명시적으로 제공되지 않으면 기본값은 특정 값입니다. 슬라이스의 경우:

  • 누락된 하한의 기본값은 0입니다.
  • 누락된 상한의 기본값은 len(slice)(cap(slice) 아님)입니다.

주어진 코드에서 오류가 발생하는 이유는 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