Массив — фиксированный размер, задаётся при объявлении: [5]int. Слайс — динамическая обёртка над массивом: содержит указатель на underlying array, длину (len) и ёмкость (cap).
arr := [3]int{1, 2, 3} // массив, размер — часть типа
sl := []int{1, 2, 3} // слайс, динамический
Массив передаётся по значению (копируется), слайс передаёт копию заголовка, но данные общие. При append слайс может вырасти — тогда аллоцируется новый underlying array. В 99% случаев используют слайсы.