>백엔드 개발 >Golang >Go 슬라이스의 용량이 0이 아닌데도 \'패닉: 런타임 오류: 인덱스가 범위를 벗어났습니다\'가 발생하는 이유는 무엇입니까?

Go 슬라이스의 용량이 0이 아닌데도 \'패닉: 런타임 오류: 인덱스가 범위를 벗어났습니다\'가 발생하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-02 09:08:03662검색

Why am I getting

배열 길이가 Null이 아닐 때 "패닉: 런타임 오류: 인덱스가 범위를 벗어났습니다" 문제 해결

Go에서 배열 또는 슬라이스를 사용하려면 길이와 용량의 개념을 이해하는 것이 중요합니다. 해당 코드 조각에서 문제는 make([]string, 0, 4)를 사용하여 결과 배열을 초기화하는 데서 발생합니다.

make([]string, 0, 4)의 역할 이해

make([]string, 0, 4)는 초기 길이가 0이고 용량이 4인 []string 유형의 슬라이스를 생성합니다. 용량은 저장할 수 있는 요소의 최대 수를 정의합니다. 메모리를 재할당하지 않고 슬라이스를 만듭니다.

길이와 용량의 구별

길이는 현재 슬라이스에 있는 요소 수를 나타내고, 용량은 보유할 수 있는 최대 크기를 나타냅니다. . 슬라이스에 이미 충분한 요소가 포함된 경우 용량 내에서 항목을 더 추가해도 재할당이 발생하지 않습니다. 그러나 용량을 초과하면 새로운 기본 배열을 생성하고 기존 요소를 복사하는 재할당이 트리거됩니다.

코드에서 make([]string, 0, 4)는 용량이 있는 빈 슬라이스를 초기화합니다. of 4. 현재 길이(인덱스 0)를 초과하는 요소에 액세스하려고 하면 해당 인덱스에 요소가 없기 때문에 런타임 오류가 발생합니다.

문제 해결

충분한 초기 길이로 슬라이스를 초기화하거나 추가를 사용하여 필요에 따라 슬라이스를 동적으로 늘리면 오류를 해결할 수 있습니다.

옵션 1: 충분한 길이로 초기화

슬라이스에 저장될 대략적인 요소 수를 알고 있는 경우 적절한 길이로 초기화할 수 있습니다. 예를 들어 result := make([]string, 4)는 길이와 용량이 4인 슬라이스를 초기화합니다.

옵션 2: Append 사용

Append 추가 요소를 슬라이스 끝에 추가합니다. 슬라이스의 용량이 충분하면 새 요소를 수용하기 위해 다시 슬라이스됩니다. 그렇지 않은 경우 새 기본 배열이 할당됩니다. Append를 반복적으로 사용하면 용량 초과에 대한 걱정 없이 필요에 따라 슬라이스를 점진적으로 늘릴 수 있습니다.

Append를 사용하여 단순화된 코드

다음은 Append를 사용하여 단순화된 코드 버전입니다. 추가:

<code class="go">package main

import (
    "fmt"
    "strings"
)

func main() {
    strs := strings.Fields("Political srt")
    var result []string
    for _, s := range strs {
        if strings.ContainsAny(s, "eaiu") {
            result = append(result, s)
        }
    }
    fmt.Println(result)
}</code>

위 내용은 Go 슬라이스의 용량이 0이 아닌데도 \'패닉: 런타임 오류: 인덱스가 범위를 벗어났습니다\'가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.