Не предлагая нового решения, просто пытаюсь объяснить, почему ваша программа ведет себя так, как вы просили:
Давайте сначала попытаемся понять, как работает встроенная функция 'copy'. Ссылка: [https://golang.org/pkg/builtin/#copy]
func copy(dst, src []Type) int
Встроенная функция копирования копирует элементы из исходного слайса в целевой слайс. (В особом случае он также будет копировать байты из строки в секцию байтов.) Источник и назначение могут перекрываться. Copy возвращает количество скопированных элементов, которое будет минимумом len (src) и len (dst).
Две вещи: 1. Сначала закомментируйте строку: // a [len (a) -1] = 0
Второе: поскольку вы используете один и тот же массив, то есть как источник и место назначения, вы получаете [2,3,4,4] в качестве вывода, поскольку массив назначения равен {1,2,3,4}, который был перезаписан на {2,3,4,4 (который уже есть)} вы можете попробовать использовать разные массивы, чтобы сделать его более понятным