Ответ
var s []int - создает nil slice (len=0, cap=0), готовый к append, но без выделенной памяти.
make([]int, len, cap) - создает slice с заданной длиной и емкостью, инициализированный нулями.
Присваивание по индексу (s := []int{1,2,3}) создает slice с конкретными значениями (len=cap=3).
append работает с любым slice, выделяя память при необходимости.
Пример:
var s1 []int // nil slice
s2 := make([]int, 3) // [0, 0, 0]
s3 := []int{1, 2, 3} // [1, 2, 3]
s1 = append(s1, 1) // [1]
var - для отложенной инициализации, make - для предварительного выделения памяти, литерал - для конкретных значений.