моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Мы представили if и for в нашей предыдущей статье. Это не следует практиковать. Давайте попрактикуемся в их использовании.continue
Оператор для вычисления суммы четных чисел в пределах 100. Когда мы пишем код,continue
Оператор поможет нам пропустить определенные итерации, которые не нужны, например, в этом примере мы пропустим все нечетные числа.
- sum := 0
- for i := 1; i < 100; i++{
- if i & 1 == 0 {
- continue
- }
- sum += i
- }
-
- fmt.Println("the sum is",sum)
В программировании нам часто приходится иметь дело с набором однотипных элементов, и эти наборы элементов представлены определенными структурами данных в языке Go. Сегодня я подробно познакомлю вас с несколькими типами коллекций в Go: массивом, срезом и картой.
Во-первых, давайте начнем с массивов. Массив — это самая базовая структура данных в Go. Это последовательность элементов одного типа фиксированной длины. После объявления массива его длину нельзя изменить. Объявление и инициализация массивов очень просты.
При объявлении массива необходимо указать тип и длину массива. Вот как объявляется массив:
var arrayName [arrayLength]elementType
Например, объявите целочисленный массив длиной 5:
var numbers [5]int
Инициализировать массив можно различными способами:
var numbers = [5]int{1, 2, 3, 4, 5}
:=
Краткое заявление:numbers := [5]int{1, 2, 3, 4, 5}
numbers := [...]int{1, 2, 3, 4, 5}
numbers := [5]int{0: 1, 4: 5}
Вы можете получить доступ к элементам массива по индексу, начиная с 0:
value := numbers[2] // 获取索引为 2 的元素
вы можете использоватьfor
Перебрать все элементы массива:
- for i, value := range numbers {
- fmt.Printf("Index: %d, Value: %dn", i, value)
- }
Вы можете использовать встроенныйlen
Функция для получения длины массива:
length := len(numbers)
Если массив не инициализирован явно, его элементам автоматически присваивается нулевое значение их типа. Например, нулевое значение целочисленного массива равно 0:
var numbers [5]int // 所有元素都是 0
Язык Go также поддерживает многомерные массивы. Ниже приведен пример объявления и инициализации целочисленного массива 2x3:
- var matrix [2][3]int
- matrix = [2][3]int{{1, 2, 3}, {4, 5, 6}}
Поскольку длина массива фиксирована, в некоторых случаях это может быть не очень гибко. Если вам нужна коллекция переменной длины, вы можете использовать срезы.
Далее идет срез — более гибкий встроенный тип, который можно рассматривать как динамический массив. Длина среза является переменной, и он создается на основе массива, что обеспечивает больше удобства. Вот как объявить и инициализировать срез:
- s := make([]int, 3) // 创建一个长度为3的整型切片
- s[0] = 1 // 切片元素赋值
- s[1] = 2
- s[2] = 3
- s = append(s, 4) // 向切片追加元素
В языке Go, хотя массивы и срезы используются для хранения серии элементов одного и того же типа, они имеют существенные различия в распределении памяти, изменчивости размера и использовании. Вот основные различия между массивами и срезами:
[3]int
и[4]int
это разные типы.[]int
Общий тип для всех целочисленных срезов.make
Функция или фрагмент массива для инициализации, размер не указан.Вот примеры инициализации массивов и срезов:
- // 数组
- var arr [3]int = [3]int{1, 2, 3}
-
- // 切片
- var slice []int = []int{1, 2, 3}
- // 或者使用 make 函数
- slice := make([]int, 3)
append
Функция добавляет элементы или получает подсрезы посредством операций нарезки.Базовый массив среза может быть размещен в куче, и временная сложность доступа к элементам среза также равна O(1), ноappend
Может привести к перераспределению базового массива, что обычно является операцией O(n).Наконец, давайте посмотрим на картографирование. Карта — это ассоциативный массив в Go, который сопоставляет ключи со значениями. Ключи карты могут быть любого типа, поддерживаемого оператором равенства, например целые числа, числа с плавающей запятой, строки, указатели, интерфейсы (при условии, что значения, содержащиеся в интерфейсе, сопоставимы), структуры и массивы. Сопоставленное значение может быть любого типа.
Синтаксис объявления карты следующий:
var mapName map[keyType]valueType
Например, объявите карту с ключами как строками и значениями как целыми числами:
var scores map[string]int
После объявления карты вам необходимо пройтиmake
функцию для ее инициализации, чтобы ее можно было использовать:
scores = make(map[string]int)
Альтернативно вы можете использовать короткое объявление и инициализировать:
scores := make(map[string]int)
Вы также можете использовать литералы для инициализации во время объявления:
- scores := map[string]int{
- "alice": 90,
- "bob": 85,
- "charlie": 88,
- }
scores["alice"] = 90
value := scores["alice"]
Если ключ не существует, будет возвращено нулевое значение для этого типа значения.
Вы можете использовать идиому запятая -ok, чтобы проверить, существует ли ключ на карте:
- value, exists := scores["alice"]
- if exists {
- // 键存在
- } else {
- // 键不存在
- }
использоватьdelete
Функция может удалить пару ключ-значение с карты:
delete(scores, "alice")
Если ключ не существует,delete
Функция ничего не делает.
использоватьfor
Цикл может проходить по всем парам ключ-значение на карте:
- for key, value := range scores {
- fmt.Printf("%s: %dn", key, value)
- }
Нулевое значение карты равноnil
.одинnil
Карта не имеет базовой структуры данных и не может добавлять элементы.Прежде чем добавлять элементы на карту, необходимо использоватьmake
Инициализируйте его.
Вы можете использовать встроенныйlen
Функция для получения количества пар ключ-значение на карте:
length := len(scores)
Ключи карты могут быть любого сопоставимого типа, например целые числа, числа с плавающей запятой, строки, указатели, интерфейсы (при условии, что значения, содержащиеся в интерфейсе, сопоставимы), структуры, массивы и т. д. Срезы, карты и функции нельзя использовать в качестве ключей карты, поскольку эти типы не поддерживают сравнения на равенство.
В языке Go массивы, срезы и карты — это три часто используемые структуры данных, каждая из которых имеет разные характеристики и особенности. Вот несколько моментов, на которые следует обратить внимание при их использовании:
nil
, необходимо инициализировать перед использованием.nil
,nil
Карта не может использоваться для хранения пар ключ-значение и должна быть инициализирована перед использованием.delete
Удаление несуществующего ключа не вызывает ошибки, но можно безопасно проверить, существует ли ключ.