Массив и фрагменты в GO

Что такое массив?

Структура данных массива - это набор элементов аналогичного типа, расположенных последовательно.

Давайте разберемся с приведенным выше определением массива, проведя аналогию. Предположим, у вас есть 5 цветных карандашей. Так как вы очень любите рисовать, вы хотите носить их с собой куда угодно, чтобы получить коробку. Чтобы положить мелки, вы открываете коробку и кладете их все рядом, один за другим. Коробка здесь похожа на массив, она содержит аналогичный набор элементов (мелки) организованно или последовательно. Теперь предположим, что эта коробка волшебная, поэтому вы можете попросить мелок, используя свой голос. Но коробка не такая уж умная, поэтому, чтобы попросить мелок, вам нужно указать положение карандаша относительно исходного положения.

Давайте посмотрим

//suppose you stored your crayons in following order
["Blue", "Green", "Red", "Purple", "Yellow"]

Теперь вам нужен «красный» цвет. Красный - третий элемент, поэтому вы скажете, дайте мне третий элемент, и коробка даст вам красный мелок. Это называется индексацией массива, а указанное вами число называется индексом. У каждого элемента есть индекс, с помощью которого к нему можно получить доступ. Индекс просто показывает, сколько мест от начальной точки. Это было много теории, теперь давайте попробуем реализовать их на языке Go.

Реализация массива

Чтобы использовать массив, первым делом нужно его объявить. Мы хотим, чтобы программа знала, что нам нужен массив. Просто откройте https://play.golang.org/ и попробуйте все, как описано в следующем разделе.

Декларация

Написав строку выше, вы только что объявили массив. Размер требуется заранее для выделения памяти. Мы объявили массив, но не указали, какие значения он содержит. В настоящее время он содержит значение по умолчанию, также называемое нулевым значением. Нулевым значением строки является «» (пустая строка). В массиве содержится["" "" "" "" "" ]. Попробуйте распечатать массив с помощью fmt.Println(crayons)

Теперь давайте вставим значения в массив. Ставить значения очень просто. Как объяснялось в предыдущем разделе, сначала вам нужен индекс (количество мест от начальной позиции), а затем вы можете установить значение для этого индекса.

crayons[0]="Blue"

Здесь мы говорим, что индекс равен 0 (поскольку это первый элемент, он находится на расстоянии 0 нигде от первого элемента. Простой способ получить индекс - x-1, если его X-й элемент, называется нулевым индексированием). Чтобы установить значение, мы используем оператор присваивания (=) и указываем значение. сделаем то же самое и для других цветов. Это как положить мелок в коробку один за другим.

crayons[1]=”Green”
crayons[2]=”Red”
crayons[3]=”Purple”
crayons[4]=”Yellow”

Если вы печатаете с fmt.Println(crayons), вы получите

Есть еще один способ инициализации массива

crayons := [5]string{ "Blue", "Green", "Red", "Purple", "Yellow" }
fmt.Println(crayons)

мы используем :=, чтобы сказать, что мы объявляем, а также инициализируем массив, и мы передаем значения массива внутри {} для его инициализации.

Массивы на детской площадке

Теперь предположим, что у вас есть еще два цветных карандаша, и вы также хотите сохранить их внутри массива, но вы не можете этого сделать, поскольку ранее вы заявили, что вам нужно сохранить только 5 значений. Как бы вы тогда хранили эти дополнительные мелки? Входит в ломтики 😎

Ломтики

Массивы хороши, но они не гибкие, вы не можете увеличивать или уменьшать их размер после объявления. Они занимают фиксированное пространство памяти. Чтобы иметь более гибкую структуру данных, у нас есть Slices in Go. Срезы похожи на Array, но они достаточно гибкие.

Фактически, слайсы строятся поверх массивов. Срез состоит из трех основных компонентов

  1. Массив: каждый фрагмент содержит внутренний массив. Фактические данные хранятся только в этом массиве.
  2. Длина. У фрагмента есть свойство "Длина", которое не указывает ни одного элемента в нем.
  3. Емкость: фрагмент содержит максимальную длину этого фрагмента, когда длина достигает максимальной емкости, при этом перераспределяется память и увеличивается ее емкость.

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

//no size specified therefore this is a slice
var crayons []string;

Вы инициализируете его так же, как инициализируете массив

//without the size
crayons := []string{ "Blue", "Green", "Red", "Purple", "Yellow" }
fmt.Println(crayons)

Вы также можете проиндексировать его, таким же образом вы проиндексируете массив при условии, что указанный индекс меньше длины массива, т.е. если длина среза равна 4, вы не можете проиндексировать седьмой элемент (arr [7] ).

Существует набор встроенных методов, которые могут помочь в манипулировании срезами. давай посмотрим на них

  1. make: make инициализирует срез, он может принимать длину среза, и мы также можем передавать емкость.
//len
crayons := make([]string , 7 )
//both len and cap
crayons := make([]string , 7 , 10)

2. copy: копирует фрагмент в другую переменную.

crayonscopy := make([]int, 5) //crayonscopy = []
copy(crayonscopy, crayons) 
//crayonscopy => ["Blue", "Green", "Red", "Purple", "Yellow"]

3. добавить: добавляет элемент в конец фрагмента.

append( crayons, "Magenta")
//["Blue", "Green", "Red", "Purple", "Yellow","Magenta"]
//can take multiple elements as well
append( crayons, "Brown" , "Pink")
//["Blue", "Green", "Red", "Purple", "Yellow","Magenta", "Brown" , "Pink"]

4. Нарезка: нарезка означает получение фрагмента (глагола) из фрагмента (структуры данных), как если бы вы могли взять кусок пиццы. Чтобы взять срез (глагол), мы можем сделать arr [x: y], где x и y меньше, чем равны длине, а x ‹= y.

sliced1 := crayons[1:2] //take from 1 index upto index less than 2 
//["Green"]
    
sliced2 := crayons[2:5] //take from 2 index upto index less than 5
//["Red", "Purple", "Yellow"]
    
sliced3 := crayons[2:] //take from 2 index upto end
//[Red", "Purple", "Yellow", "Magenta", "Brown" , "Pink"]
    
sliced2 := crayons[:3] //take from starting index upto index less than 3
//["Blue", "Green", "Red"]

Таким образом, мы также покрыли срезы. Очень рекомендую попробовать массивы и срезы на детской площадке.

Надеюсь, вам понравилась статья, и вы больше уверены в массивах и срезах. Если есть что-то, что вы хотите обсудить, не стесняйтесь. Кроме того, хлопки будут мотивировать меня писать больше статей, так же как жестом хлопать по кнопке хлопка.