배열 길이가 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!