Как растёт cap при бесконечном append

Что выведетMiddleбесплатно11-t002

В цикле идёт append по одному байту в слайс, размер которого сверху ничем не ограничен. Чтобы увидеть, как рантайм выделяет память, программа печатает каждое новое значение cap (до 4 KiB). Что она выведет — и чем закончился бы настоящий бесконечный цикл for { buf = append(buf, 1) }?

main.gogo
1package main2 3import "fmt"4 5var sink []byte6 7func main() {8	buf := make([]byte, 0)9	prev := cap(buf)10	for len(buf) < 4096 {11		buf = append(buf, 1)12		if c := cap(buf); c != prev {13			fmt.Print(c, " ")14			prev = c15		}16	}17	fmt.Println()18	sink = buf // слайс уходит в кучу19}
Чем закончится программа?
Сначала подумай без запуска — на собесе компилятора не будет.