origArray := []string{"1", "2"} //уже дает вам слайс, а не массив
origSlice := origArray[:] //в этой строке нет никакого смысла
//массив можно получить так
var myArray [2]string = [2]string{"1", "2"}
Слайс в Go - ссылочный тип. Объект этого типа содержит три атрибута len длину Int, cap поместительность Int и указатель на первый элемент Pointer.
Все аргументы в Go передаются копированием значения, то есть передавая функции слайс вы передаете копию слайса. Эта копия будет содержать собственные len и cap, но однако указатель на тот же первый элемент что и аргумент. Таким образом, чтобы модифицировать элементы слайса достаточно передать его функции, чтобы защитить слайс от модификации функцией нужно передавать его копию сделанную встроенной функцией copy(dst, src) Чтобы дать функции доступ к длине len и вместительности cap слайса следует передавать указатель на него. append очевидно требует изменения не только элементов но и длины и вместительности слайса поэтому передавать нужно указатель на слайс.
foo(&origSlice){
*origSlice = append(* origSlice, "3")
...
Однако осторожней
foo (origSlice){
origSlice[1]="baz"
...
}
изменит оригинальный origSlice, хотя и не может изменить его длину