Размер — часть типа
Массивы здесь уже знаем, фокус этого блока — тип, копирование и сравнение.
- Тип массива включает длину, поэтому
[3]intи[5]int— разные типы. - Нельзя присвоить один массив другому, если длина разная:
var arr4 [3]int
var arr5 [5]int
// arr4 = arr5 // ❌ ошибка: разные типы
Копирование массива в Go
- Присваивание копирует все элементы, а не ссылку:
arr1 := [3]int{1, 2, 3}
arr2 := arr1 // создаётся копия
arr1[0] = 100
fmt.Println(arr1) // [100 2 3]
fmt.Println(arr2) // [1 2 3] — не изменился
arr1иarr2лежат в разных местах памяти, работают независимо.
Сравнение массивов
- Массивы можно сравнивать оператором
==, если у них одинаковый тип (и длина, и элементный тип совпадают). - Сравнение идёт поэлементно:
arr6 := [3]int{1, 2, 3}
arr7 := [3]int{1, 2, 3}
arr8 := [3]int{1, 2, 4}
fmt.Println(arr6 == arr7) // true
fmt.Println(arr6 == arr8) // false
[1, 2, 3]равно[1, 2, 3], но не равно[1, 3, 2].
Контраст с JavaScript (и похожими языками)
- В JavaScript массивы — ссылочные:
const arr1 = [10, 20, 30]
const arr2 = [10, 20, 30]
console.log(arr1 === arr2) // false
- Даже с одинаковыми значениями — это разные объекты в памяти, поэтому
===даётfalse. - В Go при
arr1 == arr2сравниваются значения элементов, а не адреса.