Почему при изменении массива и слайса переданных в функцию у них разное поведение?
Вычитал на go.dev что структура slice имеет 3 поля: указатель на массив, len, cap. Но как устроен обычный массив я так и не нашел но подозреваю что он состоит из указателя и len.
Также мне известно что при передаче данных в функцию то они просто копируются (без явного указания что этого указатель и при этом это не map)
У меня возник вопрос, что будет если передать массив и слайс в функцию которая их изменит и после посмотреть содержимое изначальных переменных и оказалось что поведут они себя по разному
Пример:
package main
import (
"fmt"
"unsafe"
)
func main() {
slice := []int{1, 2, 3, 4}
testSlice(slice)
fmt.Println("slice main:", slice, unsafe.Pointer(&slice))
array := [4]int{1, 2, 3, 4}
testArray(array)
fmt.Println("array main:", array, unsafe.Pointer(&array))
}
func testSlice(slice []int) {
slice[0] = 0
fmt.Println("slice func:", slice, unsafe.Pointer(&slice))
}
func testArray(array [4]int) {
array[0] = 0
fmt.Println("array func:", array, unsafe.Pointer(&array))
}
Данных код выведет следующий результат:
slice func: [0 2 3 4] 0xc000094078
slice main: [0 2 3 4] 0xc000094060
array func: [0 2 3 4] 0xc0000d0080
array main: [1 2 3 4] 0xc0000d0060
Видно что слайс изменился и в main функции, а массив показал ожидаемый результат. Я не нашел информации почему так происходит и хотел бы за одно посмотреть реализацию массива