Подтвердить что ты не робот

Типы данных Array и Slice

Я запутался в типах данных array и slice.

В Go документах массивы описываются следующим образом:

Существуют серьезные различия между методами работы массивов в Go и C. В Go

  • Массивы являются значениями. Присвоение одного массива другому копирует все элементы.
  • В частности, если вы передадите массив функции, он получит копию массива, а не указатель на него.
  • Размер массива является частью его типа. Типы [10] int и [20] int различны.

Функции:

Как и во всех языках семейства C, все в Go передается по значению. То есть функция всегда получает копию передаваемой вещи, как если бы существовал оператор присваивания, присваивающий значение параметру. Например, передача значения int в функцию делает копию int, а передача значения указателя - копию указателя, но не данных, на которые он указывает.

Почему sort.Ints(arrayValue) изменяет переданную переменную, когда я объявил ее как массив, а не как срез?

Код

var av = []int{1,5,2,3,7}

fmt.Println(av)
sort.Ints(av)
fmt.Println(av)
return

Выход

[1 5 2 3 7]
[1 2 3 5 7]
4b9b3361

Ответ 1

Смотрите раздел " Ломтики: использование и внутренности ".

var av = []int{1,5,2,3,7}

Это кусочек, а не массив.

Литерал фрагмента объявляется так же, как литерал массива, за исключением того, что вы пропускаете количество элементов.

Это объясняет, почему функция сортировки изменяет содержимое того, на что ссылается срез.

Как прокомментировал ниже Кирк, sort.Ints выдаст вам ошибку, если вы передадите ему массив вместо среза.

func Ints(a []int)

Ответ 2

Потому что вы используете срез, а не массив.

Это фрагмент:

var av = []int{1,5,2,3,7}

И это массивы:

var av = [...]int{1,5,2,3,7}
var bv = [5]int{1,5,2,3,7}

Если вы попытаетесь скомпилировать:

var av = [...]int{1,5,2,3,7}
fmt.Println(av)
sort.Ints(av)
fmt.Println(av)

вы получите сообщение об ошибке:

не может использовать av (type [5] int) как type [] int в аргументе функции

как sort.Ints ожидает получить slice [] int.

Ответ 3

[]int{1,5,2,3,7} не является массивом. Массив имеет длину в нем типа, например [5]int{1,5,2,3,7}.

Сделайте копию среза и отсортируйте его:

a := []int{1,5,2,3,7}
sortedA := make([]int, len(a))
copy(sortedA, a)
sort.Ints(sortedA)
fmt.Println(a)
fmt.Println(sortedA)

Ответ 4

var av = []int{1,5,2,3,7}

в приведенном выше утверждении вы инициализируете срез как массив

Чтобы создать массив, синтаксис должен быть

var av = [5]int{1,5,2,3,7}

Ответ 5

срезы являются указателем на массив. когда вы копируете массив в другой или когда вы передаете массив в функцию, вся копия массива копируется или передается. Это делает более дорогостоящую операцию, если размер массива большой. так что мы можем пойти на ломтики.