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

Сделано срез, где емкость меньше длины


    package main

    import fmt "fmt"

    func main(){

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

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


    panic: runtime error: makeslice: cap out of range

    runtime.panic+0x9e /go/src/pkg/runtime/proc.c:1060
            runtime.panic(0x453b00, 0x30020390)
    runtime.panicstring+0x94 /go/src/pkg/runtime/runtime.c:116
            runtime.panicstring(0x4afd6c, 0x40d80c)
    runtime.makeslice+0x70 /go/src/pkg/runtime/slice.c:24
            runtime.makeslice(0x44302c, 0xa, 0x0, 0x5, 0x0, ...)
    main.main+0x45 C:/GOEXCE~1/basics/DATATY~1/slice.go:8
            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

Мой вопрос: может ли емкость быть меньше длины?

Если «Да», то почему появилась эта ошибка?
И если «нет», почему это ошибка времени выполнения, а почему не время компиляции?

Ответы [ 2 ]

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

Нет, емкость не может быть меньше длины.

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

Следующий фрагмент всегда сохраняется для среза s (если вы не сделали что-то небезопасное):

0 <= len(s) <= cap(s)

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

package main

import (
    "fmt"
    "rand"
)

func main() {
    k := make([]int, rand.Int(), rand.Int())
    fmt.Println(k)
}

Переданные в make значения не могут быть известны до времени выполнения.

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

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

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

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

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