Скажем, мы создали срез следующим образом:
arr := make([]byte, 0, 10)
arr = append(arr, []byte{1, 1, 1}...)
И затем мы хотим освободить 7 хвостовых байтов:
arr = arr[:len(arr)]
Вы не можете;Go GC не делает частичные освобождения.10 байтов будут выделяться до тех пор, пока не будет никаких ссылок на какую-либо часть из 10 байтов.
Например, для освобождения хвостовых байтов,
package main
import "fmt"
func main() {
arr := make([]byte, 0, 10)
arr = append(arr, []byte{1, 1, 1}...)
// free tail bytes:
fmt.Println(len(arr), cap(arr), &arr[0], arr)
arr = append(make([]byte, 0, len(arr)), arr...)
fmt.Println(len(arr), cap(arr), &arr[0], arr)
}
Детская площадка: https://play.golang.org/p/l6cbiBoMf4j
Вывод:
3 10 0x414020 [1 1 1]
3 3 0x414050 [1 1 1]
Блог Go: Go Slices: использование и внутренние компоненты