Ответ 1
Да, все в Go передается по значению. Ломтики тоже. Но значение среза представляет собой заголовок, описывающий смежный раздел массива поддержки, а значение среза содержит указатель на массив, в котором элементы фактически хранятся. Значение среза не включает его элементы (в отличие от массивов).
Итак, когда вы передаете фрагмент функции, из этого заголовка будет сделана копия, включая указатель, который будет указывать на один и тот же массив поддержки. Изменение элементов среза подразумевает модификацию элементов массива подложки, и поэтому все срезы, которые имеют один и тот же базовый массив, будут "наблюдать" изменение.
Чтобы узнать, что в заголовке среза, выберите reflect.SliceHeader
тип:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
См. соответствующий/возможный дублирующий вопрос: Параметр функции Golang передан как copy-on-write?
Читайте сообщение в блоге: Go Slices: использование и внутренние параметры