Интересно, какое самое простое объяснение этой знаменитой цитаты:
Не общайтесь, разделяя память; делитесь памятью, общаясь. (Р. Пайк)
В модели памяти Go я могу прочитать следующее:
Отправка по каналу происходит до завершения соответствующего приема от этого канала. (Спецификация Голанга)
Существует также специальная статья о golang, объясняющая цитату. И ключевой вклад - это рабочий пример, также написанный Эндрю Дж.
Хорошо. Иногда слишком много разговоров ... Я извлек из цитаты из спецификации памяти, а также посмотрев на рабочий пример:
После того, как goroutine1 отправляет (что угодно) в goroutine2 через канал, все изменения (где угодно в памяти), сделанные goroutine1, должны быть видны goroutine2 после того, как они были получены через тот же канал. (Лемма Голанга, написанная мной :)
Поэтому я беру приземленное объяснение известной цитаты:
Чтобы синхронизировать доступ к памяти между двумя горутинами, вам не нужно отправлять эту память по каналу. Достаточно хорошо принимать с канала (даже ничего). Вы увидите любые изменения, которые были записаны (где угодно) при отправке горутины (на канал) во время ее отправки. (Конечно, при условии, что никакие другие горутины не записывают в ту же самую память.) Обновление (2) 8-26-2017
На самом деле у меня два вопроса:
1) Верно ли мое заключение?
2) Помогает ли мое объяснение?
Обновление (1) Я предполагаю небуферизованные каналы. Давайте ограничимся этим в первую очередь, чтобы не перегружать себя слишком большим количеством неизвестных.
Пожалуйста, давайте также сосредоточимся на простом сценарии использования двух горутин, обменивающихся данными по одному каналу, и связанных эффектах памяти, а не на лучших практиках - это выходит за рамки этого вопроса.
Чтобы лучше понять объем моего вопроса, предположим, что горутины могут обращаться к любой структуре памяти - не только к примитивным - и она может быть большой, это может быть строка, карта, массив, что угодно.