Итераторы Go 1.23, унификация стандартов и улучшение экосистемы Go
Итераторы Go 1.23, унификация стандартов и улучшение экосистемы Go

Предисловие

Go 1.23 Версия существует по пекинскому времени 2024 Год 8 луна 14 раннее утро 1:03 выпускать。Эта версия содержит несколько крупных обновлений.,Конкретное содержание можно найти в моем предыдущемизстатья:Вышла версия Go 1.23, вы должны знать эти важные обновления!。本文将重点介绍 iterator Стандартный Итератор。

Вы готовы? Возьмите чашку любимого кофе или чая и узнайте, прочитав эту статью.

Почему были введены стандартные итераторы

Итераторсуществовать Go Эта концепция не нова в языке. Фактически, она существует с тех пор, как существует. Go в экосистеме. Если вы часто используете Go стандартная библиотека,Возможно, вы заметили, что некоторые библиотеки предоставляют реализацию Итератора.,Например:bufio.Scannerdatabase.Rowsfilepath.Walk(Dir)flag.Visit и sync.Map.Range ждать. Так почему Go Будет ли чиновник по-прежнему предоставлять единые стандарты из Итератора? Основная причина существования заключается в том, что существующие конструкции и способы использования различаются. Когда мы используем новую библиотеку, нам обычно нужно научиться ею пользоваться. Если стандартизированную форму Итераториза можно унифицировать, нам нужно только освоить стандартное определение и использование Итераториза, и мы сможем адаптироваться ко всем Итераторизу.

Итератор

существовать Go 1.23 середина,Итератор Фактически, это относится к функции, которая соответствует одной из следующих трех сигнатур функции:

Язык кода:go
копировать
func(yield func() bool)

func(yield func(V) bool)

func(yield func(K, V) bool)

Если значение, возвращаемое функцией или методом, соответствует одной из приведенных выше форм, то возвращаемое значение можно вызвать Итератор

Итератор делится на Нажмите Итератор и Ла Итератор,Вышеуказанная конструкция является типичнойиз Нажмите Итератор,Позвонив yield Функция проходит через ряд значений,yield функция возвращает bool,Решите, продолжать ли развертывание.

Пример кода:

Язык кода:go
копировать
func Backward[E any](s []E) func(yield func(int, E) bool) {
    return func(yield func(int, E) bool) {
        for i := len(s) - 1; i >= 0; i-- {
            if !yield(i, s[i]) {
                return
            }
        }
    }
}

существуют В этом примере Итератор будет проходить в обратном порядке s элементы в срезе и передать yield Функция выталкивает каждый элемент. если yield возвращаться false,Обход прекратится преждевременно.

Диапазон по типам функций (обход типов функций)

Прочитав предыдущую реализацию из Итератора, вы запутались: Итератор передается путем вызова yield Функция постепенно выводит значение элемента, так как же нам получить значение, полученное от Итератора? Ответ заключается в использовании for-range цикл.

существовать Go 1.23 版本середина,for-range Выражения диапазона в циклах были улучшены. Ранее выражения диапазона поддерживались только array(множество)、slice(кусочек) и map(картографирование) и т. д. типов и от Go 1.23 начинать,Добавлена ​​поддержка типов функций из. но,Тип функции должен быть одним из трех типов, упомянутых выше.,То есть функцию необходимо реализовать Итератор.

Пример кода:

Язык кода:go
копировать
package main

import "fmt"

func main() {
	s := []string{"Программист", "Чен Минён"}
	for i, v := range Backward(s) {
		fmt.Println(i, v)
	}
}

// Backward Итерация в обратном порядке
func Backward[E any](s []E) func(yield func(int, E) bool) {
	return func(yield func(int, E) bool) {
		for i := len(s) - 1; i >= 0; i-- {
			if !yield(i, s[i]) {
				return
			}
		}
	}
}

Результаты запуска программы:

Язык кода:bash
копировать
1 Чен Минён
0 программист

iter Сумка

Для упрощения использования Итераториз,Go 1.23 Добавлена ​​новая версия iter Сумка, Сумка определяет два типа Итераторов, а именно Seq и Seq2,Используется для обработки различных сценариев итерации.

Язык кода:go
копировать
package iter

type Seq[V any] func(yield func(V) bool)

type Seq2[K, V any] func(yield func(K, V) bool)

Seq и Seq2 Разница:

  • Seq[V any]undefinedSeq это универсальный тип функции, которая получает yield функция как параметр。он запускает один элемент,Напримеркусочекиз索引或картографированиесерединаизключ。yield функция возвращает bool,Решите, продолжать ли итерацию.

Сценарий использования: Может использоваться для получения одного значения в результате итерации.,Например, индекс или значение в срезе,Или ключ или значение на карте.

  • Seq2[K, V any]undefinedSeq2 это универсальный тип функции, которая получает yield функция,Нажмите пару элементов,Например, индекс и значение в срезе,或者картографированиесерединаизключ值对。yield функция同样возвращаться bool,к Решите, продолжать ли итерацию.

Сценарий использования: используется, когда необходимо получить доступ к двум значениям (например, ключам и значениям) одновременно.

существуют Набор случаев использования Итераториз в наборе

Язык кода:go
копировать
type Set[E comparable] struct {
	m map[E]struct{}
}

func NewSet[E comparable]() Set[E] {
	return Set[E]{m: make(map[E]struct{})}
}

func (s Set[E]) Add(e E) {
	s.m[e] = struct{}{}
}

func (s Set[E]) Remove(e E) {
	delete(s.m, e)
}

func (s Set[E]) Contains(e E) bool {
	_, ok := s.m[e]
	return ok
}

Вышеупомянутое является простым универсальным Set Реализация коллекции, коллекция Сумка содержит тип map[E]struct{} из m Поле,Используется для хранения элементов коллекции.。Set В сборнике также представлены Add(Добавить элемент)、Remove(Удалять)и Contains(Определить, существует ли элементсуществовать)Три основных метода。

потому что m Поле не экспортируется, и разработчик не может напрямую получить к нему доступ в других полях. Если разработчик хочет пройти по элементам коллекции, то есть пройти m Как реализовать маппинг? Мы можем настроить метод Итератора или появиться m Отображение предназначено для того, чтобы пользователи могли перемещаться самостоятельно. Однако, что более важно, мы можем использовать Go 1.23 Предоставляет механизм из Итератор для реализации этой функциональности.

Язык кода:go
копировать
func (s Set[E]) All() iter.Seq[E] {
	return func(yield func(E) bool) {
		for v := range s.m {
			if !yield(v) {
				return
			}
		}
	}
}

Полный пример кода:

Язык кода:go
копировать
package main

import (
	"fmt"
	"iter"
)

type Set[E comparable] struct {
	m map[E]struct{}
}

func NewSet[E comparable]() Set[E] {
	return Set[E]{m: make(map[E]struct{})}
}

func (s Set[E]) Add(e E) {
	s.m[e] = struct{}{}
}

func (s Set[E]) Remove(e E) {
	delete(s.m, e)
}

func (s Set[E]) Contains(e E) bool {
	_, ok := s.m[e]
	return ok
}

func (s Set[E]) All() iter.Seq[E] {
	return func(yield func(E) bool) {
		for v := range s.m {
			if !yield(v) {
				return
			}
		}
	}
}

func main() {
	set := NewSet[string]()
	set.Add("Программист")
	set.Add("Чен Минён")

	for v := range set.All() {
		fmt.Println(v)
	}
}

Результаты запуска программы:

Язык кода:bash
копировать
программист
Чен Минён

Ла Итератор

существовать讲 Ла Итератор Прежде, давайте сначала поймем Нажмите Ла Итератор Оба различия:

  • Нажмите Итератор Активно перемещайте каждое значение в контейнере, чтобы yield функциясередина。существовать Go язык, мы можем пройти for-range Цикл напрямую получает отправленное значение.
  • Вопреки этому,Ла Итератор Вызывающий абонент активно запрашивает данные. Каждый раз, когда ты звонишь Ла Итератор время,它从容器середина拉出下一个值ивозвращаться。Хотя for/range Заявление не поддерживает напрямую Ла Итератор,Но через обычныеиз for 循环可к轻松实现对Ла Итераториз Итерировать。

стоит быть счастливым из,Нам не нужно вручную реализовывать Ла Итератор,потому что iter предоставлено Сумкой Pull функция, которая получает Стандартный (Push) Итератор Тип из параметра, получается два параметра, первый параметр Ла Итератор,Второй параметр останавливаться функция. Когда нам больше не нужно будет вытаскивать элемент из, вызовем останавливаться Просто функционируйте.

Пример кода:

Язык кода:go
копировать
package main

import (
	"fmt"
	"iter"
)

type Set[E comparable] struct {
	m map[E]struct{}
}

func NewSet[E comparable]() Set[E] {
	return Set[E]{m: make(map[E]struct{})}
}

func (s Set[E]) Add(e E) {
	s.m[e] = struct{}{}
}

func (s Set[E]) Remove(e E) {
	delete(s.m, e)
}

func (s Set[E]) Contains(e E) bool {
	_, ok := s.m[e]
	return ok
}

func (s Set[E]) All() iter.Seq[E] {
	return func(yield func(E) bool) {
		for v := range s.m {
			if !yield(v) {
				return
			}
		}
	}
}

func main() {
	set := NewSet[string]()
	set.Add("Программист")
	set.Add("Чен Минён")

	next, stop := iter.Pull(set.All())
	for {
		v, ok := next()
		if !ok {
			break
		}
		fmt.Println(v)
		stop()
	}
}

Активный звонок stop функция приведет к yield функция提前возвращаться false,так что проходи next Функция получает из ok также будет false,Указывает конец итерации,Больше элементов получить невозможно.

Результаты запуска программы:

Язык кода:bash
копировать
программист

В стандартную библиотеку добавлена ​​новая функция из Итератор.

С введением Итераториз,slices и maps Сумка также добавляет несколько новых функций для использования с Итераториз.

slices Сумма, недавно добавленная из функции:

  • All([]E) iter.Seq2[int, E]
  • Values([]E) iter.Seq[E]
  • Collect(iter.Seq[E]) []E
  • AppendSeq([]E, iter.Seq[E]) []E
  • Backward([]E) iter.Seq2[int, E]
  • Sorted(iter.Seq[E]) []E
  • SortedFunc(iter.Seq[E], func(E, E) int) []E
  • SortedStableFunc(iter.Seq[E], func(E, E) int) []E
  • Repeat([]E, int) []E
  • Chunk([]E, int) iter.Seq([]E)

Информацию об использовании этих функций см. slices Сумкадокумент

maps Сумма, недавно добавленная из функции:

  • All(map[K]V) iter.Seq2[K, V]
  • Keys(map[K]V) iter.Seq[K]
  • Values(map[K]V) iter.Seq[V]
  • Collect(iter.Seq2[K, V]) map[K, V]
  • Insert(map[K, V], iter.Seq2[K, V])

Информацию об использовании этих функций см. maps Сумкадокумент

краткое содержание

В этой статье подробно рассказывается Go 1.23 Версия в из Итераторе. Содержание охватывает введение Стандартный Итератор из Основные причины, определение Итератора и как его использовать. Кроме того, обсуждалось также iter Расширение функции Сумкаиз и slices и maps из и функции, связанные с Итератором, были добавлены в стандартную библиотеку.

Некоторые думают, что введение Итератора делает Go Становится более сложным, поскольку реализация кода Итератора может повлиять на читаемость. Для тех, кто новичок в Go Итераториз Для разработчиков,Вы действительно можете чувствовать себя немного некомфортно. но,Go Чтобы упростить использование Итератоза, чиновник добавил: iter Сумка,исуществовать slices и maps В Сумке предусмотрено множество удобных функций для улучшения процесса разработки.

В целом введение Стандартный Итератор Унифицировал дизайн и использование Итераториз, решил проблему фрагментации и дополнительно оптимизировал. Go изэкосистема。

Что вы думаете об Итераторе? Добро пожаловать, чтобы оставить сообщение в области комментариев для обсуждения.

Ссылки

Range Over Function Types

Рекомендуем к прочтению

Вышла версия Go 1.23, вы должны знать эти важные обновления!

Go 1.23 Новая функция: Таймер и Ticker из Важная оптимизация

Go 1.23 Новая функция: ломтики, синхронизация и другие основные библиотеки были доработаны, чтобы значительно улучшить процесс разработки.

Привет,Я Чен Минён,Разработчик, который любит технологии и готов поделиться,Он также является энтузиастом открытого исходного кода.

Путь к успеху не переполнен. Вы заинтересованы в том, чтобы найти компаньона?

Следуйте за мной, добавляйте меня в друзья, учитесь и совершенствуйтесь вместе!

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose