Размер — часть типа

Массивы здесь уже знаем, фокус этого блока — тип, копирование и сравнение.

  • Тип массива включает длину, поэтому [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 сравниваются значения элементов, а не адреса.