Что делает slice[0:0] в Go?

# #go

Вопрос:

Недавно я увидел следующий код в анализаторе уценки Golang:

     blankLines := make([]lineStat, 0, 128)
    isBlank := false
    for { // process blocks separated by blank lines
        _, lines, ok := reader.SkipBlankLines()
        if !ok {
            return
        }
        lineNum, _ := reader.Position()
        if lines != 0 {
            blankLines = blankLines[0:0]
            l := len(pc.OpenedBlocks())
            for i := 0; i < l; i   {
                blankLines = append(blankLines, lineStat{lineNum - 1, i, lines != 0})
            }
        }
 

Я в замешательстве относительно того, что blankLines = blankLines[0:0] делает. Является ли это способом добавления к массиву?

Комментарии:

1. Это не массив, здесь вы имеете дело со срезами

2. Это считается базовой концепцией языка, рассмотренной здесь , например.

3. О, упс … я имел в виду кусочек. Я был просто сбит с толку, потому что мне казалось, что не было никакой цели создавать пустой срез.

Ответ №1:

Это [0:0] срезание создает срез, который имеет тот же резервный массив, но нулевой длины. Все, что он действительно делает,-это «сбрасывает» len на срезе, чтобы базовый массив можно было использовать повторно. Это позволяет избежать выделения, которое может потребоваться, если для каждой итерации был создан совершенно новый срез.