Ответ
append возвращает новый слайс, потому что исходный слайс может не иметь достаточной емкости (cap) для добавления элементов. В этом случае аллоцируется новый массив, и возвращается слайс, указывающий на него. Даже если емкости хватает, возвращаемое значение — это слайс с обновленной длиной (len), что делает API последовательным.
Пример:
s := []int{1, 2, 3}
s = append(s, 4) // Может изменить базовый массив
fmt.Println(s) // [1 2 3 4]
Если не перезаписать исходный слайс, изменения потеряются:
s := []int{1, 2}
append(s, 3) // Без присваивания — бесполезно
fmt.Println(s) // [1 2]