2016-01-21 3 views
0

Если есть список, который необходимо сгенерировать и обработать (в идеале, при создании), что такое соглашение? Кажется, что обратные вызовы не используются так сильно, в то время как каналы являются универсальным фаворитом. Не будет решающего преимущества либо для предоставления обратного вызова для каждого элемента, либо для запуска goroutine для создания списка и синхронного чтения и обработки каждого элемента.Шаблон посетителя против канала в Go

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

+0

Тип трудно сравнивать, поскольку шаблон посетителя является образцом; способ кодирования. Принимая во внимание, что канал - действительно действительно приятная система очередей. Это может быть блокировка или неблокирование, FIFO и просто чрезвычайно проста в использовании. – khuderm

+0

@khuderm Согласовано, но давайте просто передадим обратный вызов, который, по крайней мере, немного проще, чем запуск goroutine и установка блока для выбора. –

ответ

3

Конвенция заключается в использовании обратных вызовов. Вот несколько примеров в стандартной библиотеке: filepath.Walk, ast.Walk.

Недостатком канала с образцом генератора является то, что он утечки гортина, когда потребитель не получает, пока канал не будет закрыт. Другая проблема заключается в том, что создается возможность для расчётов данных. Стандартная библиотека использовала этот шаблон в первые дни Go. Из-за этих проблем этот код был удален до Go 1.

Смежные вопросы