Preallocating a slice can make growth intent explicit and avoid repeated capacity changes.

Slice Preallocation

slice_preallocation.go
package main

import "fmt"

func main() {
	var expected = 
	values := make([]int, 0, expected)
	for i := 0; i < expected; i++ {
		values = append(values, i*i)
	}

	fmt.Println("expected=", expected)
	fmt.Println("length=", len(values))
	fmt.Println("capacity=", cap(values))
	fmt.Println("values=", values)
}
package main

import "fmt"

func main() {
	var expected = 
	values := make([]int, 0, expected)
	for i := 0; i < expected; i++ {
		values = append(values, i*i)
	}

	fmt.Println("expected=", expected)
	fmt.Println("length=", len(values))
	fmt.Println("capacity=", cap(values))
	fmt.Println("values=", values)
}
package main

import "fmt"

func main() {
	var expected = 
	values := make([]int, 0, expected)
	for i := 0; i < expected; i++ {
		values = append(values, i*i)
	}

	fmt.Println("expected=", expected)
	fmt.Println("length=", len(values))
	fmt.Println("capacity=", cap(values))
	fmt.Println("values=", values)
}
preallocation Use `make` with capacity when code already knows the likely number of appended values.