Почему один из моих двух срезов pani c с "ошибкой времени выполнения: индекс выходит за пределы диапазона"? - PullRequest
0 голосов
/ 27 февраля 2020
func main() {
        str1 := make([]string, 10)
        str2 := []string{}
        fmt.Println(str1[0]) *No error*
        fmt.Println(str2[0]) *error*
    }

Почему fmt.Println(str2[0]) показывает ошибку в Go?

1 Ответ

3 голосов
/ 27 февраля 2020

Спецификация языка программирования Go

Индексные выражения

Первичное выражение формы

a[x]

обозначает элемент массива, указатель на массив, фрагмент или строку a, проиндексированный x. Значение x называется индексом,

индекс x находится в диапазоне, если 0 <= x < len(a), в противном случае он выходит за пределы диапазона


[]string{} make([]string, 0) и str2[0] вне диапазона.

package main

import (
    "fmt"
)

func main() {
    str1 := make([]string, 10)
    fmt.Println(len(str1), cap(str1), str1)
    str2 := []string{}
    fmt.Println(len(str2), cap(str2), str2)
    fmt.Println(str1[0]) // *No error*
    fmt.Println(str2[0]) // *error*
}

Детская площадка: https://play.golang.org/p/p31fUyb4pqW

Выход:

10 10 [         ]
0 0 []

panic: runtime error: index out of range [0] with length 0
...