Я думаю, что ваша проблема в том, что вы путаете массивы и фрагменты.
Массивы - это списки значений фиксированной длины. Вы на самом деле не используете никаких массивов в вашем примере. Массивы могут быть объявлены несколькими способами:
arr1 := [3]int{1, 2, 3} // an array of 3 integers, 1-3
arr2 := [...]int{1, 2, 3} // same as the previous line, but we're letting
// the compiler figure out the size of the array
var arr3 [3]int // a zeroed out array of 3 integers
Вы используете ломтики. Срез - это ссылка на базовый массив. Есть несколько способов выделить новые фрагменты:
slice1 := []int{1, 2, 3} // a slice of length 3 containing the integers 1-3
slice2 := make([]int, 3) // a slice of length 3 containing three zero-value integers
slice3 := make([]int, 3, 5) // a slice of length 3, capacity 5 that's all zeroed out
Любые другие назначения срезов просто дублируют ссылку на массив.
Теперь, когда мы это установили, строка
arr := []int{1, 2, 3, 4, 5}
создает срез, ссылающийся на анонимный базовый массив, который содержит числа 1-5.
arr2 := arr
дублирует эту ссылку - не копирует базовый массив. Так что есть один базовый массив и две ссылки на него. Вот почему содержимое arr2 изменяется, когда вы изменяете содержимое arr. Они ссылаются на один и тот же массив.