Индекс среза больше длины и меньше емкости дает ошибку - PullRequest
2 голосов
/ 16 августа 2011

Следующий код выдает ошибку во время выполнения.

package main

import fmt "fmt"

func main(){

    type b []int
    var k = make([]b, 5, 10)
    fmt.Printf("%d\n",k[8])
    fmt.Printf("%d", len(k))
}

Ошибка выглядит следующим образом.

panic: runtime error: index out of range

runtime.panic+0x9e /go/src/pkg/runtime/proc.c:1060
        runtime.panic(0x453b00, 0x300203f0)
runtime.panicstring+0x94 /go/src/pkg/runtime/runtime.c:116
        runtime.panicstring(0x4af6c6, 0xc)
runtime.panicindex+0x26 /go/src/pkg/runtime/runtime.c:73
        runtime.panicindex()
main.main+0x8d C:/GOEXCE~1/basics/DATATY~1/slice.go:9
        main.main()
runtime.mainstart+0xf 386/asm.s:93
        runtime.mainstart()
runtime.goexit /go/src/pkg/runtime/proc.c:178
        runtime.goexit()
----- goroutine created by -----
_rt0_386+0xbf 386/asm.s:80

Хотя, если напечатано k[0] или k[1], оно работает нормально.Можете ли вы объяснить, что именно означает емкость для ломтиков.

Ответы [ 3 ]

2 голосов
/ 17 августа 2011

Вы просто индексируете, поэтому индекс должен быть меньше длины. соответствующий раздел спецификации Go говорит, что

Первичное выражение вида

а [х]

...

Для типа A или * A, где A - тип массива, или для типа S где S - тип среза:

x должно быть целочисленным значением и 0 <= x <len (a) </p>

Однако, если вы выполняете «нарезку» (например, a[6:9]), он будет работать с индексами, длина которых превышает длину, но в пределах емкости.

0 голосов
/ 15 июля 2018
var slice = make([]b, 5, 10)

равно

var array [10]b
slice := array[:5]

Разница в том, что когда вы используете var slice = make([]b, 5, 10), вы не можете получить доступ к array в slice.slice := array[:5] означает, что первый элемент slice равен array[0], а длина slice равна 5, что означает slice[0] == array[0], slice[1] == array[1], ... slice[4] == array[4].Потому что вы можете получить доступ только к индексу, который меньше длины (что означает 0 <= index < length).Длина slice равна 5, а длина array равна 10, поэтому вы можете получить доступ к array[8] (0 <= 8 <10), но не можете получить доступ к <code>slice[8] (8> 5).

Полный образец:

package main

import fmt "fmt"

func main(){

    type b []int
    var array [10]b
    slice := array[:5]
    // []
    fmt.Printf("%d\n",slice[1])
    // []
    fmt.Printf("%d\n",array[8])
    // panic: runtime error: index out of range
    fmt.Printf("%d\n",slice[8])
}

Ссылка

  1. https://blog.golang.org/go-slices-usage-and-internals
0 голосов
/ 17 августа 2011

Прочитайте Спецификация языка программирования Go .

Длина и емкость

Емкость среза - это количество элементовдля которого есть место, выделенное в базовом массиве.В любое время сохраняются следующие отношения:

0 <= len(s) <= cap(s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...