>  기사  >  백엔드 개발  >  Go 슬라이스의 길이가 Null이 아닐 때 \"패닉: 런타임 오류: 인덱스가 범위를 벗어났습니다\"가 발생하는 이유는 무엇입니까?

Go 슬라이스의 길이가 Null이 아닐 때 \"패닉: 런타임 오류: 인덱스가 범위를 벗어났습니다\"가 발생하는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 15:24:52503검색

Why Does

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

제공된 코드 조각은 문자열을 통해 반복을 시도합니다. 모음이 포함된 별도의 단어입니다. 그러나 배열 길이가 null이 아님에도 불구하고 "패닉: 런타임 오류: 인덱스가 범위를 벗어났습니다." 오류가 발생합니다.

이 오류를 이해하려면 기본 슬라이스 데이터 구조를 자세히 살펴보는 것이 중요합니다.

슬라이스 이해

Go에서 슬라이스는 배열 세그먼트의 설명자입니다. 실제 배열에 대한 포인터, 세그먼트 길이 및 용량(세그먼트가 수용할 수 있는 최대 길이)의 세 가지 구성 요소로 구성됩니다.

make([]string, 0, 4)를 사용하여 슬라이스를 생성하는 경우 , 초기 길이가 0이고 용량이 4인 빈 기본 배열이 할당됩니다.

Making a Distinction

result := make([]string, 0, 4)는 다음과 같은 방식으로 result := make([]string, 4)와 다릅니다.

  • make([]string, 0, 4): 빈 배열을 초기화합니다. 즉 결과에 액세스합니다. [0]은 패닉을 유발합니다.
  • make([]string, 4): 4개 요소로 배열을 초기화하여 결과[0]에서 결과[3]까지 액세스를 허용합니다.

추가 이해

추가 기능은 슬라이스 끝에 요소를 추가합니다. 조각의 용량이 충분하면 새 요소를 수용하기 위해 대상을 다시 조각화합니다. 그렇지 않으면 새로운 기본 배열이 할당됩니다.

코드에 적용

제공된 코드에서 result 라인은 다음과 같습니다:= make([]string, 0, 4 ) 빈 조각을 만듭니다. 루프 내에서 결과[0]에 액세스하려고 하면 패닉이 발생합니다.

이 문제를 해결하려면 다음 코드 조각과 같이 추가를 사용하여 슬라이스를 채웁니다.

<code class="go">for i := 0; i < len(strs); i++ {
    if strings.ContainsAny(strs[i], "eaiu") {
        result = append(result, strs[i])
    }
}</code>

또는 범위 기반 루프를 사용하여 코드를 단순화할 수 있습니다.

<code class="go">for _, s := range strs {
    if strings.ContainsAny(s, "eaiu") {
        result = append(result, s)
    }
}</code>

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

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