Так как нулевое значение среза (nil) действует как фрагмент нулевой длины, вы можете объявить переменную среза, а затем добавить к ней в цикле:
// Filter returns a new slice holding only
// the elements of s that satisfy f()
func Filter(s []int, fn func(int) bool) []int {
var p []int // == nil
for _, v := range s {
if fn(v) {
p = append(p, v)
}
}
return p
}
Это означает, что для добавления к фрагменту вам не нужно выделять память сначала: nil slice p int[] достаточно в качестве фрагмента для добавления.
Ответ 2
Простая декларация
var s []int
не выделяет память, а s указывает на nil, а
s := make([]int, 0)
выделяет память, а s указывает на память на срез с 0 элементами.
Обычно первый из них более идиоматичен, если вы не знаете точный размер вашего прецедента.