> 백엔드 개발 > Golang > Go에서 슬라이싱할 때 범위를 벗어난 오류를 방지하는 방법은 무엇입니까?

Go에서 슬라이싱할 때 범위를 벗어난 오류를 방지하는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-03 03:57:14
원래의
592명이 탐색했습니다.

How to Avoid Out-of-Bounds Errors When Slicing in Go?

Slicing: Out of Bounds Error in Go

Go에서 슬라이싱은 새로운 슬라이스를 생성할 수 있는 강력한 작업입니다. 기존 것. 그러나 런타임 오류를 방지하려면 잠재적인 위험을 이해하는 것이 중요합니다.

문제

다음 코드는 0을 슬라이싱할 때 범위를 벗어난 오류를 보여줍니다. 길이 슬라이스:

package main

import "fmt"

func main() {
    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에서 슬라이스는 인접한 메모리 영역에 대한 참조입니다. 슬라이스 슬라이스를 생성하면 원본 슬라이스의 하위 집합에 대한 새 참조가 생성됩니다.

위 코드의 경우 슬라이스 b의 길이는 0이고 용량은 5입니다. Go 사양에 따르면 "슬라이스 인덱스 i는 현재 상태에서 슬라이스의 i번째 요소를 나타냅니다." 따라서 길이가 0인 슬라이스의 인덱스 1에 있는 요소에 액세스하려는 시도는 범위를 벗어났습니다.

해결책

경계 오류가 발생하면 슬라이싱할 때 사용된 인덱스가 원본 슬라이스의 유효한 범위 내에 있는지 확인하세요. 슬라이스의 경우 이 범위는 슬라이스의 길이와 용량에 따라 결정됩니다.

예를 들어 다음 작업이 유효합니다.

  • c := b[1:1]: 길이가 0이고 용량이 4인 슬라이스.
  • c := b[1:2]: 길이가 1이고 용량이 슬라이스를 생성합니다. 4.
  • c := b[1:cap(b)]: 길이가 4이고 용량이 4인 슬라이스를 생성합니다.

결론

Go에서의 슬라이싱은 데이터 조작의 기본 작업입니다. 그러나 런타임 오류를 방지하려면 제한 사항을 이해하는 것이 중요합니다. 슬라이싱 시 사용되는 인덱스가 유효한 범위 내에 있는지 확인하면 범위를 벗어난 오류를 효과적으로 방지하고 안전하게 슬라이스 작업을 할 수 있습니다.

위 내용은 Go에서 슬라이싱할 때 범위를 벗어난 오류를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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