Список Must Read статей по Go. Для всех golang-разработчиков, которые хотят перестать быть code-monkey и стать синьор помидорами. Не все и не всем бывает сразу понятно и очевидно, поэтому уровень статей вариьируется от примитивных до не очень.
https://habr.com/ru/post/325468/ - хорошее и простое описание того, как устроены под капотом массивы, слайсы, интерфейсы
https://medium.com/@Jarema./golang-slice-append-gotcha-e9020ff37374 - интересный пример граблей аппенда в слайс, важно для понимания работы слайса. Толкового объяснения происходящего конкретно в этой статье нет, но если прочитать предыдущую статью выше, можно понять, что происходит :D
https://habr.com/ru/post/457728/ - весьма подробное описание того, как же устроены мапы, что такое бакеты и как в мапе работает поиск
https://dave.cheney.net/2018/05/29/how-the-go-runtime-implements-maps-efficiently-without-generics - более подробное описание того, как устроены мапы
https://habr.com/ru/post/308070/ - описание того, как устроены каналы и что происходит с ними при чтении и записи (само собой, на уровне того, что происходит со структурой которой является канал)
https://boakye.yiadom.org/go/strings/ - как реализован тип данных string
https://yourbasic.org/golang/rune/ - что такое руны
https://blog.gopheracademy.com/advent-2017/unsafe-pointer-and-system-calls/ - кое-что об использовании unsafe.Pointer с примерами применения
Важно понимать, что главной характерной особенностью языка Go является работа с конкуретностью. Конкурентный код писать и отлаживать, как мне кажется, тяжелее, однако ниже приведены статьи, которые я бы порекомендовал прочитать для того, чтобы проще было работать с конкурентностью.
https://proglib.io/p/parallelnoe-programmirovanie-v-go-2021-05-23 - по большей части обзорная статья с простыми примерами использования горутин, каналов, мьютексов и.т.д. Полезно для тех, кто очень редко сталкивался с многопоточностью и не знает, как правильно пользоваться перечисленными фичами.
https://proglib.io/p/parallelizm-v-golang-i-workerpool-chast-1-2020-12-24
https://proglib.io/p/parallelizm-v-golang-i-workerpool-chast-2-2020-12-26 - статьи на тему того, как построить пул обработчиков (он же Worker Pool). Я бы не сказал, что конкретно эти пулы - идеальное решение (в первой статье мне не понравилась обработка ошибок в конце), но для ознакомления подойдет. Но я бы не советовал начинать изучение пулов именно с этих статей. Во второй части мне не понравилась остановка пула, это проще сделать через сигнальный канал struct{}, а именно через его закрытие. Примеры такого способа (правда в рамках конвейеров) есть в статье Go concurrency patterns
выше.
https://habr.com/ru/post/490336/ - отличная статья для того, чтобы научиться работать с каналами и горутинами. Особенность данной статьи: плавный рост сложности примеров. Маленькие примеры, я считаю, это хорошо, особенно на начальных этапах изучения.
Важные момент: стоит понимать разницу между конкурентностью и параллелизмом. Конкурентность в Golang не гарантирует параллелизма выполнения задач под капотом. В статье ниже это раскрывается.
https://medium.com/technofunnel/understanding-golang-and-goroutines-72ac3c9a014d - статья на тему конкурентности и параллельности выполнения. Помогает понять разницу между этими понятиями а так же объясняет, почему работа с разными горутинами не гарантирует параллельность выполнения.
https://blog.golang.org/pipelines - статья на тему паттернов конкуретности. Показаны простые примеры, благодаря которым можно понять как правильно пользоваться каналами и горутинами на примере конвейеров.
https://dev.to/joashxu/series/15760 - цикл коротких статей на тему написания конкурентного кода в рамках решения каких-либо проблем. Каждая статья разобрана в формате проблема - пример решения с описанием того, как это решение работает. Отлично подходит тем, кто начитался статей о конкуретности, но которым не очевидно, как это применять.
https://itnext.io/explain-to-me-go-concurrency-worker-pool-pattern-like-im-five-e5f1be71e2b0 - простое объяснение и пример workerpool'а, возможно самого распространенного паттерна конкурентности в go.
https://m.habr.com/ru/company/ruvds/blog/442648/
https://povilasv.me/go-scheduler/
https://medium.com/clean-code-channel/go-memory-ballast-dec0c04830b1
https://habr.com/ru/post/490570/
https://medium.com/eureka-engineering/understanding-allocations-in-go-stack-heap-memory-9a2631b5035d
https://go-traps.appspot.com/#watchman - типичные ошибки и грабли гоферов
http://devs.cloudimmunity.com/gotchas-and-common-mistakes-in-go-golang/index.html - типичные ошибки и грабли гоферов
https://betterprogramming.pub/7-code-patterns-in-go-i-cant-live-without-f46f72f58c4b - 7 трюков и паттернов гошного кода. Примеры: использование мапы в качестве множества (map[keyType]struct{}), использование сигнального канала (chan struct{}, однако в большинстве случаев на практике лучше использовать context.Done()). Есть и другие полезные примеры.