30 лучших книг для освоения языка программирования Go
Ищете книги по Go? Представляем 30 книг для освоения языка программирования Go, которые ответят на вопросы новичков и уверенных разработчиков.
Эта книга – бесплатное введение в Golang. Предназначена для разработчиков, которых не устраивает идея указателей и статической типизации. На самом деле, это больше, чем просто «маленькая книга»: название свидетельствует лишь о простоте изложения.
Книга является кратким введением в язык Go. Разработанный «гуглом», это язык программирования общего назначения с современными функциями, чистым синтаксисом и надежной библиотекой, что делает его идеальным для изучения в качестве первого языка программирования.
Изначально книга появилась в качестве пособия к мероприятию, но в ней также есть полезный контент от Google и команды создателей в соответствии с лицензией Creative Commons Attribution 3.0, а также код, лицензированный в соответствии с BSD.
Онлайн-учебник для начинающих. Содержит множество упражнений по разным темам языка программирования Go.
Книга, с помощью которой JavaScript-eры смогут легко перейти на Gо. В книге рассмотрены отличия между языками в целях облегчения перехода с одного языка на другой.
С этой книгой заинтересованный новичок сможет стать гуру. Сначала автор вводит описание концепций и особенностей языка, затем вы узнаете то, что позволит приступить к практическому написанию приложений, в том числе веб-сайтов, сетевых серверов, обработчиков информации. В самом конце книги рассмотрены секретные штуки, к примеру, вы узнаете про интеграцию Gо и C.
В этой книге показано, как создавать мощные системы и применять знания в реальных задачах. Плюсами проектов, созданных на этом языке программирования, являются масштабируемость, производительность и доступность. Уроки, изложенные автором, помогут воспользоваться всеми преимуществами при написании кода.
На сегодняшний день Gо – один из самых впечатляющих новых языков программирования. Изначально он создавался для того, чтобы помочь задействовать всю мощь современных многоядерных процессоров. В этом руководстве автор показывает, как писать программы, в полной мере использующие его революционные возможности и идиомы.
Книга не предполагает предварительного изучения Go или опыта работы с каким-либо конкретным языком, поэтому она подойдет как «чайникам», так и тем, кто привык писать на других языках.
Исходный код свободно доступен для загрузки с сайта, дополняющего книгу.
Прочесть эту книгу – хорошее решение для начинающих, знакомых с основами программирования. Практическое руководство обеспечивает легкое введение в язык. Автор раскрывает основные функции языка с пошаговыми инструкциями и упражнениями в каждой главе, которые помогут вам практиковать то, чему вы учитесь.
Изучив более 25 глав этой книги, вы быстро научитесь программированию на новом языке. Большинство примеров из этой книги можно выполнить на тестовой среде, поэтому вам не нужно беспокоиться о создании практической среды. Вместо выполнения скучных заданий придётся поиграть, если вам, конечно, это по душе.
Эта книга поможет вам начать работу с программированием на Gо. В ней описываются все элементы языка и иллюстрируется их использование с примерами кода.
Изучайте Gо, решая проблемы. Каждый рецепт является полноценным решением проблемы практического программирования. Помимо классических тем, в книге затронуты работа с данными посредством NoSQL, MongoDB и RethinkDB. Кроме того, здесь содержится подробное руководство по созданию масштабируемых интерфейсных API для ваших мобильных и веб-приложений.
Книга охватывает языковые спецификации, документацию, блоги, видео, слайды и авторские впечатления от написания. Здесь есть всё необходимое для глубокого понимания языка.
Краткое руководство по разработке тестов. Доступна только онлайн.
Эта книга охватывает сетевую архитектуру и обозревает язык. Погрузитесь в ключевые темы сетевой архитектуры: сериализацию данных, протоколы, символы и кодировки.
Помимо базовых принципов, книга охватывает проблемы в области сетей и безопасности: HTTP и HTTPS, шаблоны, удаленный вызов процедур (RPC), веб-сокеты, включая HTML5 и многое другое.
Эта книга проведет вас через историю параллелизма, расскажет о его использовании в Gо, отличии от других языков, а также об особенностях структур ядра параллелизма. В каждой главе представлены реальные примеры с подробными описаниями методологий. К концу вам будет комфортно создавать безопасные, совместимые, высокопроизводительные приложения.
Этот практический справочник объясняет конкретные стратегии, которые можно использовать в своих повседневных приложениях. Вы изучите методы создания веб-сервисов, использование Gо в облаке, тестирование и отладку, маршрутизацию, сетевые приложения и т. д.
Записная книжка Gо-разработчика.
Примеры кода показывают решения наиболее частых проблем при разработке, чтобы научиться разрабатывать качественное ПО. Вы изучите специфику работы с Golang string, коллекциями, массивами, обработкой ошибок, горутинами, срезами, картами, каналами, номерами, датами, временем, файлами, сетями, веб-приложениями и временем выполнения.
Изучите шаблоны проектирования для упрощения разработки.
Создавайте отзывчивые приложения с Gоlang.
Ресурс для всех, кто желает научиться создавать Gо-приложения для веба.
Еще одна потрясающая книга для изучения веб-разработки.
Автор знакомит с наиболее важными аспектами проектирования, создания и развертывания веб-сервиса с использованием методов REST, уделяет особое внимание скорости, безопасности и гибкости. Вы начнете с создания своего первого API в Gо посредством HTTP, займетесь проектированием приложения, узнаете о Model-View-Controller, поймете методы развертывания кода и рассмотрите возможности языка по части безопасности.
В этой книге содержатся основные понятия: языковые структуры, стандартные библиотеки и инструменты. Также рассказывается о более продвинутых функциях, таких как концепции параллелизма, методологии тестирования и структуры пакетов.
После прочтения вы будете знать, как структурировать проекты, эффективно использовать параллелизм и передовые методы тестирования.
Книга учит созданию веб-приложений, с использованием современных принципов проектирования. Здесь собрана куча примеров по таким темам, как запросы обработки и отправка ответов, механизмы шаблонов, параллелизм, тестирование и развертывание веб-приложений.
Книга для тех, кто немного знаком с Gо и веб-разработкой. Мы (вы) создадим веб-приложения без использования сторонних структур и с минимальным количеством сторонних библиотек. Сможете научиться разработке с нуля.
Вместо банальных вещей в этой книге показывается, как создавать полезные приложения, такие как Pixieset, с нуля. Книга рассчитана на новичков.
Бесценный ресурс, который учит работать с наиболее полезными функциями языка программирования Gо.
Мы что-то упустили? Вы знаете не менее полезные книги по Go, которые не были затронуты в статье? Напишите нам о них, и они войдут в нашу следующую подборку 🙂
Другие материалы по языку программирования Go:
12 книг для изучения языка программирования Go
Golang или Go — относительно новый язык, который ориентирован на многопоточность. Его в 2009 году запустил концерн Google. На Западе он уже обрёл свою популярность и занял нишу среди других языков, но до нас толком не дошёл, — пишет KV.BY. Лишь сейчас начинаются попытки освоения этого языка. Это видно даже по скудности выбора литературы для изучения. Из-за этого большая часть представленных учебников будет только на английском языке.
Программирование на языке Go
Перед языком Golang ставилась цель максимально использовать заложенную мощность в многоядерные процессоры. Марк Саммерфильд продемонстрирует вам возможности языка, идиомы и способы написания программ. В книге собрана вся информация, нужная для создания функциональных и работающих приложений. Автор показывает преимущества Go перед другими языками, указывая на ключевые особенности. Марк в этой книге продемонстрирует вам тонкости параллельного программирования, применение динамической типизации и прочие плюшки.
Книга подойдёт и новичкам и тем, кто уже имеет некоторое представление о Go.
Go на практике
Расчёт идёт на опытных программистов, использующих этот язык. Книга — свод рецептов по решению типовых вопросов, возникающих при создании приложения или программы. Пособие построено по принципу «вопрос-решение-обсуждение». Книга показывает концепцию языка Go, демонстрирует приемы, тестирование и отладка, маршрутизацию и прочие возможности. Также затронут вопрос о создании облачных приложений.
Язык программирования Go
Книга универсальная и подойдёт как новичкам, так и уже имеющим какие-то знания по языку. Хотя, проще в ней будет ориентироваться более опытным программистам. Книга поможет также освоить язык, если вы до этого работали с другими. Здесь описаны его плюсы, зачем вообще создавался Go, узнаете, как писать эффективно и идиоматично.
Авторы — профессионалы в двух областях: программировании и написании учебного материала. Тут приведены примеры решения практических вопросов, приемы, облегчающие написание кода и т.д.
Go in action
Пособие рассчитано на тех, кто владеет основами языка Go. Go in action проведет вас от начинающего программиста к маэстро, виртуозно управляющим кодом Golang. Авторы с первых страниц погружают вас в особенности и концепции языка, а затем постепенно подводят к получению опыта практическим путем.
Задания, предлагаемые книгой, – это веб-ресурсы, серверы и приложения. В процессе программирования вам поведают о методах манипулирования, преобразования данных и прочих фишках.
Introducing Go
Миниатюрная книжка в 62 страницы. Казалось бы, что можно понять из такого маленького объема? Но, если у вас есть опыт работы с другими языками, то это пособие быстро проведет вас по азам Go и поможет вам определиться, нужен ли вам он или лучше поискать что-то иное. А вторым доводом в пользу книги идет тот факт, что она от O’Really.
Книга пошагово знакомит с языком, в конце каждой главы есть задания для усвоения материала. Главы короткие, лаконичные, но понятные и простые. Все идет по принципу цепочки. Так что перескочить с одного на другое не получится, да и малый объем не позволит это сделать.
Get Programming with Go
Книга для новичков. Она поможет освоить азы языка Go за 32 урока. Пособие разбито на 7 модулей, которые познакомят с языком. Последний блок уроков откроет дверь в параллельное программирование на Go.
Учебник обучит вас синтаксису языка, даст множество заданий для самостоятельной работы. Все задания можно выполнять в тестовой среде.
Go Programming by Example
Обучение программированию происходит на примерах кода реально работающих приложений и ресурсов. Удобно, ведь сразу запоминается синтаксис, манера кодить и сами особенности языка. Рассматриваемых тем в книге масса, и вот некоторые из них: среда разработки, массивы, функции, указатели, структуры, методы, программирование сокетов, баз данных и много других.
The Go Bestiary
Это не учебник, а, скорее, сборник советов и рекомендаций, собранных воедино. Здесь вы найдете способы структурировать свои проекты, увидите распространенные и нежелательные ошибки. Это учебное пособие рассчитано на более опытных программистов, но и тем, кто работал с другими языками, будет полезна изложенная здесь информация.
Learning Go Programming
Это пошаговое практическое руководство, которое поможет вам быстро начать работу с Go. Начнете с изучения основ языка Go, затем продолжите знакомиться с детальным описанием типов данных Go. После этого вы узнаете, как использовать идиомы параллелизма, чтобы избежать подводных камней и создавать программы, которые точно соответствуют ожидаемому поведению. Наконец, вы сможете использовать некоторые из наиболее важных функций GO, такие как сетевое программирование и интеграция с ОС, для создания эффективных приложений. Все концепции объясняются в четкой и сжатой форме.
Network Programming with Go
А вот книга для матерых программистов на Go. Вам предстоит погрузиться в важные аспекты сетевой архитектуры и Go, такие как сериализация данных, протоколы уровня приложений. Кроме основ, сетевое программирование охватывает ключевые вопросы по HTTP и HTTPS, шаблонам, удаленным вызовам процедур (RPC) и т.д.
Кроме того, автор Ян Ньюмарч поможет вам в создании и подключении к полноценному веб-серверу на основе Go. Эта книга может служить как важным учебным пособием, так и справочным материалом по сетям Go.
Mastering Concurrency in Go
Учебник расскажет вам о параллелизме, о том, как Go использует ее, о возможностях и структурах ядра параллелизма Go. На каждом этапе в книге будут представлены реальные, полезные фрагменты кода с подробным описанием используемых методов. К концу вы будете чувствовать себя уверенно, создавая безопасное, согласованное с данными, высокопроизводительную параллельную программу.
Цель этой книги — показать, как можно использовать Go для создания высокопроизводительных, надежных параллельных программ с уникальной формой многопоточности, в которой применяются процедуры, связывающиеся и синхронизирующиеся по каналам.
Mastering Go Web Services
Этот учебник познакомит вас с главными моментами проектирования, создания и развертывания веб-службы с применением идиоматических методов REST с акцентом на быструю, безопасную и гибкую работу. Первым делом вы создадите свой API с пакетом HTTP. Вы будете смотреть на создание и сборку вашего приложения, включая популярные структуры дизайна. Вы также увидите способы развертывания кода для подготовки и разработки. Наконец, вы увидите, как функции безопасности в Go могут использоваться для защиты от внедрения SQL-кода и компрометации конфиденциальных данных.
К концу этой книги вы достигнете высокого уровня мастерства в создании и развертывании веб-сервисов и веб-API с помощью Go.
📕 ТОП-10 книг по языку программирования Go: от новичка до профессионала
Джей Макгаврен. Head First. Изучаем Go
Джей Макгаврен. Head First. Изучаем GoВ книге Джея Макгаврена подробно и последовательно изложены базовые сведения, необходимые для освоения нового языка. Читатели познакомятся с типами данных, функциями, переменными и массивами, а также освоят более сложные аспекты программирования на Go, вплоть до работы с сетевыми коммуникациями и многопроцессорной обработкой.
Отмеченные читателями достоинства:
- доступный, лёгкий для восприятия язык;
- обилие наглядных примеров;
- выдержанный баланс между теоретическим базисом и практической составляющей.
Недостатки:
- не очень высокое качество перевода, рекомендуется читать книгу в оригинале;
- книга предназначена исключительно для новичков, переходящих с другого языка на Go;
- может показаться затянутой и чрезмерно подробной.
Максим Жашкевич. Язык Go для начинающих
Максим Жашкевич. Язык Go для начинающихНа протяжении 12 глав автор знакомит читателя с миром языка программирования Go, затрагивая широкий круг тем: типы переменных, функции, массивы, интерфейсы, ООП, горутины и каналы. Также даны наставления для самообразования.
Достоинства:
- находится в открытом доступе;
- лаконичная и простая подача материалов:
- интуитивно понятный язык;
- наглядные примеры;
- обилие затронутых тем – от примитивов вначале до собственного REST API в завершении.
Недостатки:
- порой слишком минималистичный стиль изложения материала, новичку может показаться, что ряд важных нюансов автором опущен.
Caleb Doxsey. Introducing Go: Build Reliable, Scalable Programs
Introducing Go: Build Reliable, Scalable ProgramsЕщё одна работа уважаемого в среде программистов издательства O’REILLY, на этот раз о языке Go.
Достоинства:
- небольшой объём и доступное изложение позволит быстро освоить материал книги;
- пошаговые инструкции, сопровождаемые примерами и интересными заданиями;
- последовательное изложение: каждая новая глава книги концептуально и логически связана с предыдущей.
Недостатки:
- отсутствие перевода;
- книга позволит освоить азы, но не рассчитана на более глубокое изучение.
Мэтт Батчер, Мэтт Фарина. Go на практике
Мэтт Батчер, Мэтт Фарина. Go на практикеКнига предназначена для людей, уже освоивших программирование, например, на Java или C#. Это практическое руководство опирается на основополагающие концепции Go и знакомит читателя с примерами его использования в облаке. Изучается тестирование и отладка, а также создание веб-сервисов и других приложений.
Достоинства:
- доступный язык;
- множество примеров использования кода.
Недостатки:
- некачественная бумага;
- материал порой подан недостаточно развёрнуто;
- плохой перевод и адаптация терминов (лучше читать в оригинале).
Марк Саммерфильд. Программирование на языке Go
Марк Саммерфильд. Программирование на Go. Разработка приложений XXI векаКнига в сообществе @progbook
Универсальное пособие для изучения языка Go затрагивает сложные темы, включая написание высокопроизводительных программ. Автор разъясняет все аспекты параллельного программирования на Go, а также показывает гибкость и необычность подхода к ООП с применением механизма динамической типизации.
Достоинства:
- структура книги организована таким образом, что уже после первой главы можно создавать сложные приложения;
- полное и объёмное описание синтаксиса Go;
- интересные и нетривиальные задания;
- хороший перевод.
Недостатки:
- книга излишне формализована, стиль изложения слишком сух;
- быстро освоить материал не получится.
Алан Донован, Брайан Керниган. Язык программирования Go
Язык программирования Go | Донован Алан А. А., Керниган Брайан У.Книга в сообществе @progbook
Книга позволит читателям поближе познакомиться с языком Go, узнать о его преимуществах и недостатках, а также научиться создавать программы, решающие реальные практические задачи.
Достоинства:
- фундаментальная работа, классика жанра;
- увлекательная подача материала;
- превосходное оформление и качество бумаги;
- множество релевантных примеров;
- отличные упражнения для закрепления полученных знаний.
Недостатки:
- мягкая обложка;
- местами хромает перевод, неверная адаптация идиом и терминов.
William Kennedy, Brian Ketelsen, Erik St. Martin. Go in Action
Go in ActionС помощью этой книги можно пройти путь от владеющего только азами Go новичка до матёрого программиста, cпособного создавать сложные многопоточные приложения.
Достоинства:
- упор на практику, отсутствие отвлечённых тем;
- последовательная структура: книга плавно ведёт читателя от простого к сложному;
- множество увлекательных заданий.
Недостатки:
- книга доступна лишь на английском языке;
- порой материал подаётся чрезмерно сжато.
Vladimir Vivien. Learning to Go
Learning Go ProgrammingПошаговое руководство поможет читателю быстро начать работу с Go от самых основ до идиом параллелизма и сетевого программирования.
Достоинства:
- лаконичный стиль: всё чётко, сжато и по делу.
- объем охваченных тем: от типов данных до многопоточного программирования;
- знакомство с важными функциями Go;
- упор на практическое применение языка.
Недостатки:
- отсутствие перевода;
- множество нюансов оставлено для самостоятельного изучения.
Михалис Цукалос. Golang для профи
Golang для профи: работа с сетью, многопоточность, структуры данных и машинное обучение с GoКнига позволит вам быстро изучить многие аспекты Go: типы данных языка, работу с пакетами, конкурентность, сетевое программирование и т. д.
Достоинства:
- примеры эффективных паттернов программирования;
- широкий охват различных тем;
- уникальные материалы: машинное обучение на языке Go, нейронные сети, совместимость Go c Git, JSON и т.д.
- книга новая (издана в 2020 г.), актуальный материал.
Недостатки:
- высокая стоимость.
Nathan Cozyra. Mastering Concurrency in Go
Mastering Concurrency in GoАвтор концентрируется на использовании параллелизма в Go: на его истории и отличиях от реализации в других языках, а также на особенностях структуры ядра параллелизма.
С помощью книги можно научиться создавать безопасные и высокопроизводительные приложения.
Достоинства:
- доступная подача сложного материала, простой язык изложения;
- приведённый в издании код легко реализуем на практике;
- высокое качество кода примеров;
- обучение через практические задачи.
Недостатки:
- книга сконцентрирована на особенностях параллелизма и рекомендуется исключительно тем, кому необходимо освоить именно этот аспект программирования на Go;
- отсутствие перевода.
***
Если ваших любимых книг нет в списке, не стесняйтесь рекомендовать их в комментариях 👇. Если вы читали какое-либо из перечисленных изданий, укажите, какие его преимущества и недостатки стоит отметить.
Какую литературу можно найти по golang? — Хабр Q&A
Я бы рекомендовал изучение в такой последовательности:Beginner level (синтаксис языка):
1. Начать с golang-book.ru . Это на русском и довольно неплохо для начинающего.
2. https://golang.org/doc/effective_go.html — это уже на английском, но всё равно толково и хорошо заходит после 1-го пункта. Кратко, по делу, без воды, достаточно понятно.
После прочтения этих 2 пунктов у Вас уже будут базовые понятия о языке.
Intermediate level (concurrency — многопоточность):
Как ни пытался, не смог определить какую-то конкретную универсальную книгу. На этом уровне много плохих книг, сложно выделить что-то хорошее. Относительно неплохими для этого уровня (пока что) показались:
(продолжаем последовательность изучения Go по пунктам):
3. Базовый веб сервер на Go Статья, без которой дальнейшее трудно заходит (книгоавторам всем дружно лень такое нормально объяснить).
4. M. Curtis — Level Up Your Web Apps With Go
Читал — и не понимал — что происходит? Чувак явно пишет рельсы на Go! Всё такое до боли знакомое… Что такое? А потом смотрю в профиле https://www.linkedin.com/in/mal-curtis/ — так он же пишет на работе на Ruby on Rails! Так что книжка отлично зайдёт рельсовикам, осваивающим Go. Книга неплохая, автор явно старался. Автор, ты хороший человек.
5. K. Cox-Buday — Concurrency in Go. Tools and Techniques for Developers. Книга не очень удачная, но пока я не успел найти что-то получше. Автор — женщина, и глупая. Книга читается мучительно и крайне медленно. Охват материала неплох — но объяснения косноязычные, с водопадом лишних слов и эмоций, примеры кода неоправданно переусложнены, ряд тем вообще остались бы непонятыми, если бы не гугление. Читаю и матерюсь на каждом шагу.
PS Последние 2 главы пошёл уже такой горячечный бред, что я просто не смог заставить себя читать этот ужас. Бросил. В общем, далее параграфа Queuing читать не стоит. Книга прекрасно иллюстрирует тезис, что, какими бы умными ни были женщины, они всё равно дуры, и нечего им в программировании делать (кроме разве что 1С).
К сожалению, книгу прочесть всё-таки надо, ибо охват хорош — а заменить книгу особо нечем (в смысле другой книгой, продаваемой за деньги — разве что статьями).
Есть ещё книга N. Kozyra — Mastering Concurrency in Go — но у неё ужасные отзывы — да и я пытался читать другую книгу по Go у этого же автора — и мне также крайне не понравилось.
Смешно сказать — но по Go нет ни одной путёвой книги про Concurrency (единственное, ради чего Go был создан)!
6. Лучшее объяснение Go Context, что я пока видел. Оно даже лучше официального (написанного индусом, и оттого плохого).
7. M. Tsoukalos — Mastering Go — но только Chapter 10: Concurrency in Go – Advanced Topics — и исключая параграф Worker pools (он ошибочный — там ничто не сдерживает размножение горутин — какой же тогда это пул).
Средне-удовлетворительная глава, звёзд с небес не хватает, интереснее всего был параграф Sharing memory using goroutines — частный пример Катькиного Confinement’а.
Advanced level (микросервисы на Go):
Я пытался читать N. Jackson — Building Microservices with Go — это оказалось невозможным, книгу написал какой-то сумасшедший безумец, находящийся в состоянии наркотического опьянения. Отзывы на Амазоне это подтверждают.
Также я попытался читать M. Ryer — Go Programming Blueprints (2 ed) — только главу Chapter 10: Micro-services in Go with the Go kit Framework — не понравилось. Примеры кода сложноваты (автор пытается построить реальную систему — ну и дурак — вместо того, чтобы ограничиться демо-примером), объяснения сопутствующего материала никакие (по сути, их нет). Бесполезная глава. Несколько тем свалены вместе — но ни одна толком не объяснена. Очень слабенький автор.
Вердикт: нормальной книжки по теме «Go микросервисы» пока не обнаружено. Придётся изучать эту тематику из статей и инструкций по использованию микросервисных Go-фрэймворков — вот списочек фрэймворков:
Я начал с gRPC. Сначала прочёл официальную доку по protobuf (включая раздел о Go). Дока оказалась достаточно вменяемой. Но зато официальная дока по gRPC уже оказалась совершенно паршивой. Там 2 примера — попроще и посложней. Писали доку явно последователи тех, кто писал доку к первому ангуляру (т.е. те, кому я бы отрубил обе руки по самые плечи). Понять что-либо без исходников (к статье) — нереально. Но — исходники ещё надо найти, ибо в статье ссылки на них … нет. Оказалось, исходники тут: https://github.com/grpc/grpc-go/tree/master/exampl… . Но даже с ними — всё довольно непросто понять — даже в простейшем примере. Потому что авторы умолчали о многих важных моментах. Т.к. им в падлу шевельнуть задницей лишний раз. В общем, есть нужда в нормальном авторе, кто опишет, что такое gRPC. Попробуйте почитать статью от Шизы — это слегка окультуренный сокращённый пересказ сложного случая.
Рассмотрим Go Micro. Продукция очередного кретина (да ещё и спорного качества). Что, скажите, можно понять из таких «объяснений»? Кстати, ищите в Яндексе термин «Service Discovery» — здесь нужно понимать, что это. Посмотрите и Consul. Вот ещё разумная статья о Go-микросервисах. И ещё я понял — без предварительного изучения protobuf и gRPC понять Go Micro будет затруднительно (если вообще возможно). Желаю вам никогда не встретить на работе продукцию этого дегенерата. Go Micro показался мне китайским фонариком со встроенными компасом, радиоприёмником, часами, зарядкой, отвёрткой, точилкой для карандашей, ногтерезкой, и т.д.
Идём дальше. Go kit производит намного более лучшее впечатление. Правда, документация не полная — автору не хватило терпения её закончить. Но всё же разобраться можно — есть исходники-примеры, снабжённые подробными комментариями. Автор мне понравился.
Почитайте полезную статью-сравнение.
Приложение:
Гоняться за русскоязычными книгами по Golang не рекомендую. Я прочёл на русском:
— А. Донован, Б. Керниган — Язык программирования Go
Это совершенно отвратительная бездарная книга.
и просмотрел оглавление русскоязычной книги:
— М. Саммерфильд — Программирование на языке Go
Хотя я её не читал, но беглый просмотр её оглавления создаёт самое негативное впечатление о книге. Такое ощущение, что это целенаправленная диверсия против изучающего golang, с целью развести его на время (прочтения) и деньги (при покупке). Марк Саммерфилд — это профессиональный графоман, посмотрите сами на его карьерный путь: https://www.linkedin.com/in/qtrac/
Обе перечисленные книги (доступные онлайн бесплатно в электронном виде как векторный PDF), хотя и русскоязычные, настоятельно не рекомендую.
М. Батчер, М. Фарина — Go на практике — на русском языке — эта книга вроде бы достаточно неплохая, но она для опытного разработчика — и она не излагает системно — а отрывисто.
Пытаться читать спецификацию языка также не рекомендую — ничего не поймёте:
https://golang.org/ref/spec
Заключение
Нормальной литературы по Go практически нет (кроме азов). Все микросервисные Go-фрэймворки плохо документированы, вынуждая разбираться в них по примерам с исходниками (!).
Англоязычных книг по Golang в электронном виде бесплатно — много, более 30 (а то и под 50). Многие написаны индусами, или оторванными от жизни вузовскими преподами, или какими-то левыми любителями Go (у таких «книг» даже нет ISBN). Есть даже книги, написанные неграми! Все такие книги требуют осторожного выбора. Почему именно Go вызвал у окружающих непреодолимые позывы к графоманству? Такое впечатление, что многие авантюристы решили «срубить баблишка» на «хайповой» теме. Действительно, найти хотя бы нормальную книгу (не говоря уже о хорошей) — оказывается по факту крайне непросто — почему-то именно к Go примазались многочисленные негодяи и бездари — как ни в каком ином языке программирования.
Всё, о чём я рассказал в этом посте, доступно бесплатно онлайн в электронном виде (Либген, к примеру).
В общем-то, основное внимание при изучении Go следует уделить его возможностям по многопоточности (concurrency), которые включают низкоуровневые механизмы (как в C++) типа мьютекса и высокоуровневые механизмы типа каналов. Собственно, это как раз то самое, зачем Go вообще понадобился. Вторая по значимости тема в Go, как мне кажется, это микросервисы.
работа с сетью, многопоточность, структуры данных и машинное обучение с Go» / Блог компании Издательский дом «Питер» / Хабр
Привет, Хаброжители!Вам уже знакомы основы языка Go? В таком случае эта книга для вас. Михалис Цукалос продемонстрирует возможности языка, даст понятные и простые объяснения, приведет примеры и предложит эффективные паттерны программирования. Изучая нюансы Go, вы освоите типы и структуры данных языка, а также работу с пакетами, конкурентность, сетевое программирование, устройство компиляторов, оптимизацию и многое другое. Закрепить новые знания помогут материалы и упражнения в конце каждой главы. Уникальным материалом станет глава о машинном обучении на языке Go, в которой вы пройдёте от основополагающих статистических приемов до регрессии и кластеризации. Вы изучите классификацию, нейронные сети и приёмы выявления аномалий. Из прикладных разделов вы узнаете: как использовать Go с Docker и Kubernetes, Git, WebAssembly, JSON и др.
Глава 2 «Go изнутри» посвящена сборщику мусора Go и принципам его работы. Затем поговорим о небезопасном коде и о пакете unsafe, а также о том, как вызывать из Go-программы код на C, а из C-программы — код на Go.
Вы узнаете, как использовать ключевое слово defer, а также познакомитесь с утилитами strace(1) и dtrace(1). В оставшихся разделах этой главы вы изучите, как получить информацию о вашей среде Go, как использовать ассемблер и как генерировать из Go код WebAssembly.
Глава 3 «Работа с основными типами данных Go» посвящена типам данных, предоставляемым в Go: массивам, срезам и хеш-таблицам, а также указателям, константам, циклам, функциям для работы с датами и временем. Вы точно не захотите пропустить эту главу!
Глава 4 «Использование составных типов данных» начинается с изучения структур Go и ключевого слова struct, после чего речь пойдет о кортежах, строках, рунах, байтовых срезах и строковых литералах. Из оставшейся части главы вы узнаете о регулярных выражениях и сопоставлении с образцом, об операторе switch, пакетах strings и math/big, о разработке на Go хранилища типа «ключ — значение» и о работе с файлами форматов XML и JSON.
Глава 5 «Как улучшить код Go с помощью структур данных» посвящена разработке пользовательских структур данных в тех случаях, когда стандартные структуры Go не соответствуют конкретной задаче. Здесь же рассмотрено построение и применение бинарных деревьев, связных списков, пользовательских хеш-таблиц, стеков и очередей, а также их преимущества. В этой главе продемонстрировано использование структур из стандартного пакета Go container, а также показано, как можно использовать Go для проверки головоломок судоку и генерации случайных чисел.
Глава 6 «Неочевидные знания о пакетах и функциях Go» посвящена пакетам и функциям, в том числе использованию функции init(), стандартного Go-пакета syscall, а также пакетов text/template и html/template. Кроме того, вы узнаете, как применять расширенные пакеты go/scanner, go/parser и go/token. Эта глава определенно улучшит ваши навыки разработки на Go!
В главе 7 «Рефлексия и интерфейсы на все случаи жизни» обсуждаются три передовые концепции Go: рефлексия, интерфейсы и методы типов. Кроме того, в этой главе описываются объектно-ориентированные возможности Go и способы отладки Go-программ с помощью Delve.
Глава 8 «Как объяснить UNIX-системе, что она должна делать» посвящена системному программированию на Go. Здесь рассматриваются такие темы, как пакет flag для работы с аргументами командной строки, обработка сигналов UNIX, файловый ввод и вывод, пакеты bytes, io.Reader и io.Writer, а также обсуждается использование пакетов Viper и Cobra Go. Напомню: если вы действительно увлекаетесь системным программированием на Go, то я настоятельно рекомендую вам после прочтения этой книги приобрести и прочесть Go Systems Programming!
В главе 9 «Конкурентность в Go: горутины, каналы и конвейеры» обсуждаются горутины, каналы и конвейеры — то, что позволяет реализовать конкурентность на Go.
Вы также узнаете, чем различаются между собой процессы, потоки и горутины, познакомитесь с пакетом sync и особенностями работы планировщика Go.
Глава 10 «Конкурентность в Go: расширенные возможности» является продолжением предыдущей главы. Прочитав ее, вы станете повелителем горутин и каналов! Вы глубже изучите планировщик Go, научитесь использовать мощное ключевое слово select, узнаете о различных типах каналов Go, а также о разделяемой памяти, мьютексах, типах sync.Mutex и sync.RWMutex. В последней части главы говорится о пакете context, пулах обработчиков и о том, как распознать состояние гонки (race conditions).
В главе 11 «Тестирование, оптимизация и профилирование кода» обсуждаются тестирование, оптимизация и профилирование кода, а также кросс-компиляция под разные платформы, создание документации, тестирование производительности Go-кода, создание тестовых функций и поиск неиспользуемого Go-кода.
Глава 12 «Основы сетевого программирования на Go» посвящена пакету net/http и тому, как разрабатывать веб-клиенты и веб-серверы на Go. Далее рассмотрены структуры http.Response, http.Request и http.Transport, а также тип http.NewServeMux. Вы даже узнаете, как разработать на Go целый веб-сайт! Кроме того, в этой главе вы научитесь читать конфигурацию сетевых интерфейсов и выполнять на Go DNS-поиск, а также использовать с Go gRPC.
В главе 13 «Сетевое программирование: создание серверов и клиентов» рассказывается о работе с HTTPS-трафиком и создании на Go серверов и клиентов UDP и TCP с использованием функций из пакета net. Здесь же рассмотрены такие темы, как построение клиентов и серверов RPC, разработка на Go многопоточного TCP-сервера и чтение «сырых» сетевых пакетов.
В главе 14 «Машинное обучение на Go» рассказывается о реализации на Go алгоритмов машинного обучения, включая классификацию, кластеризацию, обнаружение аномалий, выбросы, нейронные сети и TensorFlow, а также работу Go с Apache Kafka.
Эту книгу можно разделить на три логические части. В первой части подробно рассматриваются некоторые важные концепции Go, включая пользовательский ввод и вывод, загрузку внешних Go-пакетов, компиляцию Go-кода, вызов из Go кода на C и создание кода WebAssembly, а также использование основных и составных типов Go.Вторая часть начинается с главы 5 и включает в себя главы 6 и 7. Эти три главы посвящены организации Go-кода в виде пакетов и модулей, структуре Go-проектов и некоторым дополнительным функциям Go.
Последняя часть включает в себя оставшиеся семь глав и посвящена более практическим темам Go. В главах 8–11 рассказывается о системном программировании на Go, реализации конкурентности на Go, тестировании, оптимизации и профилировании кода. В последних трех главах этой книги речь идет о сетевом программировании и машинном обучении на Go.
Книга включает в себя материалы о Go и WebAssembly, использовании Docker с Go, создании профессиональных утилит работы с командной строкой с помощью пакетов Viper и Cobra, обработке JSON и YAML, выполнении операций с матрицами, работе с головоломками судоку, пакетами go/scanner и go/token, а также с git(1) и GitHub, пакетом atomic, об использовании в Go gRPC и HTTPS.
В книге представлены относительно небольшие, но полные Go-программы, которые иллюстрируют описанные концепции. У этого есть два основных преимущества: во-первых, вам не придется просматривать бесконечный листинг, чтобы изучить всего одну методику, а во-вторых, вы сможете использовать этот код как отправную точку при создании собственных приложений и утилит.
И снова о Go-каналах
Как только задействуется ключевое слово select, появляется несколько уникальных способов использования Go-каналов, позволяющих сделать гораздо больше, чем то, что вы видели в главе 9. В этом разделе вы узнаете о разных способах использования Go-каналов.
Напомню, что нулевым значением для каналов является nil, и если отправить сообщение в закрытый канал, то программа перейдет в режим паники. Но если вы попытаетесь прочитать данные из закрытого канала, то получите нулевое значение для данного типа канала. Таким образом, после закрытия канала вы больше не можете записывать в него данные, но все равно можете читать его.
Чтобы канал можно было закрыть, он не должен быть предназначен только для приема данных. Кроме того, нулевой канал всегда блокируется, то есть попытка чтения или записи с нулевого канала заблокирует канал. Это свойство каналов очень полезно в тех случаях, когда нужно отключить ветвь оператора select, — для этого достаточно присвоить переменной канала значение nil.
Наконец, при попытке закрыть нулевой канал программа поднимет панику. Рассмотрим это на примере программы closeNilChannel.go:
package main
func main() {
var c chan string
close(c)
}
Выполнение closeNilChannel.go приведет к следующему результату:
$ go run closeNilChannel.go
panic: close of nil channel
goroutine 1 [running]:
main.main()
/Users/mtsouk/closeNilChannel.go:5 +0x2a
exit status 2
Сигнальные каналы
Сигнальный канал — это канал, который применяется только для передачи сигналов. Проще говоря, сигнальный канал можно использовать в тех случаях, когда вы хотите проинформировать другую программу о чем-либо. К сигнальным каналам не нужно прибегать для передачи данных.
Не следует путать сигнальные каналы с обработкой сигналов UNIX, о которой говорилось в главе 8, это совершенно разные вещи.
Пример кода, в котором используются сигнальные каналы, мы рассмотрим далее в этой главе.
Буферизованные каналы
Тема этого подраздела — буферизованные каналы. Это каналы, которые позволяют планировщику Go быстро размещать задания в очереди, чтобы обрабатывать больше запросов. Кроме того, их можно использовать в качестве семафоров, позволяющих ограничить пропускную способность приложения.
Представленный здесь метод работает так: все входящие запросы перенаправляются на канал, который обрабатывает их по очереди. Когда канал завершает обработку запроса, он отправляет исходному вызывающему объекту сообщение о том, что канал готов обработать новый запрос. Таким образом, емкость буфера канала ограничивает количество одновременных запросов, которые этот канал может хранить.
Мы рассмотрим этот метод на примере кода программы bufChannel.go. Разделим его на четыре части.
Первая часть кода bufChannel.go выглядит так:
package main
import (
"fmt"
)
Второй фрагмент файла bufChannel.go содержит следующий код Go:
func main() {
numbers := make(chan int, 5)
counter := 10
Представленное здесь определение numbers позволяет хранить в этом канале до пяти целых чисел.
В третьей части bufChannel.go содержится следующий код Go:
for i := 0; i < counter; i++ {
select {
case numbers <- i:
default:
fmt.Println("Not enough space for", i)
}
}
В этом коде мы попытались поместить в канал numbers десять чисел. Однако, поскольку в numbers есть место только для пяти целых чисел, сохранить в нем все десять целых чисел нам не удастся.
Остальной код Go из файла bufChannel.go выглядит так:
for i := 0; i < counter+5; i++ {
select {
case num := <-numbers:
fmt.Println(num)
default:
fmt.Println("Nothing more to be done!")
break
}
}
}
В этом коде Go мы попытались прочитать содержимое канала numbers с помощью цикла for и оператора select. Пока в канале numbers есть что читать, будет выполняться первая ветвь оператора select. Когда канал numbers пустой, выполняется ветвь default.
Выполнение bufChannel.go приведет к результату следующего вида:
$ go run bufChannel.go
Not enough space for 5
Not enough space for 6
Not enough space for 7
Not enough space for 8
Not enough space for 9
0
1
2
3
4
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Nothing more to be done!
Нулевые каналы
В этом разделе вы познакомитесь с нулевыми каналами. Это особый вид каналов, который всегда блокирован. Мы рассмотрим эти каналы на примере программы nilChannel.go. Разделим ее на четыре фрагмента кода.
Первая часть nilChannel.go выглядит так:
package main
import (
"fmt"
"math/rand"
"time"
)
Во второй части nilChannel.go содержится следующий код Go:
func add(c chan int) {
sum := 0
t := time.NewTimer(time.Second)
for {
select {
case input := <-c:
sum = sum + input
case <-t.C:
c = nil
fmt.Println(sum)
}
}
}
Здесь на примере функции add() показано, как используется нулевой канал. Оператор
Третий фрагмент кода nilChannel.go выглядит так:
func send(c chan int) {
for {
c <- rand.Intn(10)
}
}
Цель функции send() — генерировать случайные числа и отправлять их в канал до тех пор, пока канал открыт.
Остальной код Go в nilChannel.go выглядит так:
func main() {
c := make(chan int)
go add(c)
go send(c)
time.Sleep(3 * time.Second)
}
Функция time.Sleep() нужна для того, чтобы у двух горутин было достаточно времени для выполнения.
Запуск nilChannel.go приведет к следующим результатам:
$ go run nilChannel.go
13167523
$ go run nilChannel.go
12988362
Поскольку количество выполнений первой ветви оператора select в функции add() не является фиксированным, запустив nilChannel.go несколько раз, мы получим разные результаты.
Каналы каналов
Канал каналов — это особая разновидность переменной канала, которая вместо обычных типов переменных работает с другими каналами. Тем не менее для канала каналов все равно нужно объявить тип данных. Для того чтобы определить канал каналов, нужно использовать ключевое слово chan два раза подряд, как показано в следующем выражении:
c1 := make(chan chan int)
Другие типы каналов, представленные в этой главе, более популярны и полезны, чем каналы каналов.
Мы рассмотрим использование каналов каналов на примере кода, который находится в файле chSquare.go. Разделим его на четыре части.
Первая часть chSquare.go выглядит так:
package main
import (
"fmt"
"os"
"strconv"
"time"
)
var times int
Вторая часть chSquare.go содержит следующий код Go:
func f1(cc chan chan int, f chan bool) {
c := make(chan int)
cc <- c
defer close(c)
sum := 0
select {
case x := <-c:
for i := 0; i <= x; i++ {
sum = sum + i
}
c <- sum
case <-f:
return
}
}
Объявив обычный канал типа int, передаем его переменной канала каналов. Затем с помощью оператора select мы получаем возможность читать данные из обычного канала типа int или выходить из функции, используя сигнальный канал f.
Прочитав одно значение из канала c, мы запускаем цикл for, вычисляющий сумму всех целых чисел от 0 до целочисленного значения, которое мы только что прочитали. Затем отправляем вычисленное значение в канал c типа int и на этом завершаем работу.
В третьей части chSquare.go содержится следующий код Go:
func main() {
arguments := os.Args
if len(arguments) != 2 {
fmt.Println("Need just one integer argument!")
return
}
times, err := strconv.Atoi(arguments[1])
if err != nil {
fmt.Println(err)
return
}
cc := make(chan chan int)
В последней строке этого фрагмента кода мы объявляем переменную канала каналов с именем cc. Эта переменная является звездой данной программы, потому что именно от нее здесь все зависит. Переменная cc передается в функцию f1() и используется в следующем цикле for.
Оставшийся код Go программы chSquare.go выглядит так:
for i := 1; i < times+1; i++ {
f := make(chan bool)
go f1(cc, f)
ch := <-cc
ch <- i
for sum := range ch {
fmt.Print("Sum(", i, ")=", sum)
}
fmt.Println()
time.Sleep(time.Second)
close(f)
}
}
Канал f является сигнальным каналом для завершения горутины, когда вся работа закончена. Инструкция ch: =
Тип сигнального канала может быть любым, включая bool, примененный в предыдущем коде, и struct{}, который будет использоваться для сигнального канала в следующем разделе. Главным преимуществом сигнального канала типа struct{} является то, что в такой канал нельзя отправлять данные, это предотвращает возникновение ошибок.
Выполнение chSquare.go приведет к результатам такого вида:
$ go run chSquare.go 4
Sum(1)=1
Sum(2)=3
Sum(3)=6
Sum(4)=10
$ go run chSquare.go 7
Sum(1)=1
Sum(2)=3
Sum(3)=6
Sum(4)=10
Sum(5)=15
Sum(6)=21
Sum(7)=28
Выбор последовательности исполнения горутин
Вы не обязаны делать какие-либо предположения относительно последовательности выполнения горутин. Однако бывают случаи, когда необходимо контролировать этот порядок. В данном подразделе вы узнаете, как это делать с помощью сигнальных каналов.
Вы спросите: «Зачем создавать горутины, а затем выполнять их в заданном порядке, если то же самое гораздо легче сделать с помощью обычных функций?» Ответ прост: горутины способны работать одновременно и ожидать завершения других горутин, тогда как функции не могут этого делать, поскольку выполняются последовательно.
В этом подразделе мы рассмотрим программу Go, которая называется defineOrder.go. Разделим ее на пять частей. Первая часть defineOrder.go выглядит так:
package main
import (
"fmt"
"time"
)
func A(a, b chan struct{}) {
<-a
fmt.Println("A()!")
time.Sleep(time.Second)
close(b)
}
Функция A() заблокирована каналом, который хранится в параметре a. Как только этот канал будет разблокирован в main(), функция A() начнет работать. В конце она закроет канал b, тем самым разблокировав другую функцию — в данном случае B().
Вторая часть defineOrder.go содержит следующий код Go:
func B(a, b chan struct{}) {
<-a
fmt.Println("B()!")
close(b)
}
Логика функции B() такая же, как и у A(). Эта функция блокируется, пока не будет закрыт канал a. Затем она выполняет свою работу и закрывает канал b. Обратите внимание, что каналы a и b ссылаются на имена параметров функции.
Третий фрагмент кода defineOrder.go выглядит так:
func C(a chan struct{}) {
<-a
fmt.Println("C()!")
}
Функция C() заблокирована и ожидает закрытия канала a, чтобы начать работу.
В четвертой части defineOrder.go содержится следующий код:
func main() {
x := make(chan struct{})
y := make(chan struct{})
z := make(chan struct{})
Эти три канала станут параметрами трех функций.
В последнем фрагменте defineOrder.go содержится следующий код Go:
go C(z)
go A(x, y)
go C(z)
go B(y, z)
go C(z)
close(x)
time.Sleep(3 * time.Second)
}
Здесь программа выполняет все нужные функции, а потом закрывает канал x и засыпает на три секунды.
Выполнение defineOrder.go приведет к желаемому результату, несмотря на то что функция C() будет вызвана несколько раз:
$ go run defineOrder.go
A()!
B()!
C()!
C()!
C()!
Многократный вызов функции C() как горутины не вызовет проблем, потому что C() не закрывает никаких каналов. Но если вызвать A() или B() более одного раза, то, скорее всего, выведется сообщение об ошибке, например такое:
$ go run defineOrder.go
A()!
A()!
B()!
C()!
C()!
C()!
panic: close of closed channel
goroutine 7 [running]:
main.A(0xc420072060, 0xc4200720c0)
/Users/mtsouk/Desktop/defineOrder.go:12 +0x9d
created by main.main
/Users/mtsouk/Desktop/defineOrder.go:33 +0xfa
exit status 2
Как видим, здесь функция A() была вызвана дважды. Однако, когда A() закрывает канал, одна из ее горутин обнаруживает, что канал уже закрыт, и создает ситуацию паники, когда пытается закрыть этот канал снова. Если мы попытаемся более одного раза вызвать функцию B(), то получим похожую ситуацию паники.
Как не надо использовать горутины
В этом разделе вы познакомитесь с наивным способом сортировки натуральных чисел с помощью горутин. Программа, которую мы рассмотрим, называется sillySort.go. Разделим ее на две части. Первая часть sillySort.go выглядит так:
package main
import (
"fmt"
"os"
"strconv"
"sync"
"time"
)
func main() {
arguments := os.Args
if len(arguments) == 1 {
fmt.Println(os.Args[0], "n1, n2, [n]")
return
}
var wg sync.WaitGroup
for _, arg := range arguments[1:] {
n, err := strconv.Atoi(arg)
if err != nil || n < 0 {
fmt.Print(". ")
continue
}
Вторая часть sillySort.go содержит следующий код Go:
wg.Add(1)
go func(n int) {
defer wg.Done()
time.Sleep(time.Duration(n) * time.Second)
fmt.Print(n, " ")
}(n)
}
wg.Wait()
fmt.Println()
}
Сортировка выполняется посредством вызова функции time.Sleep() — чем больше натуральное число, тем больше проходит времени перед выполнением оператора fmt.Print()!
Выполнение sillySort.go приведет к результатам такого вида:
$ go run sillySort.go a -1 1 2 3 5 0 100 20 60
. . 0 1 2 3 5 20 60 100
$ go run sillySort.go a -1 1 2 3 5 0 100 -1 a 20 hello 60
. . . . . 0 1 2 3 5 20 60 100
$ go run sillySort.go 0 0 10 2 30 3 4 30
0 0 2 3 4 10 30 30
Об авторе
Михалис Цукалос (Mihalis Tsoukalos) — администратор UNIX, программист, администратор баз данных и математик. Любит писать технические книги и статьи, узнавать что-то новое. Помимо этой книги, Михалис написал Go Systems Programming, а также более 250 технических статей для многих журналов, включая Sys Admin, MacTech, Linux User and Developer, Usenix ;login:, Linux Format и Linux Journal. Сфера научных интересов Михалиса — базы данных, визуализация, статистика и машинное обучение.
О научном редакторе
Мэт Райер (Mat Ryer) пишет компьютерные программы с шести лет: сначала на BASIC для ZX Spectrum, а затем, вместе со своим отцом, — на AmigaBASIC и AMOS для Commodore Amiga. Много времени он потратил на копирование вручную кода из журнала Amiga Format, изменение значений переменных или ссылок операторов GOTO, чтобы посмотреть, что из этого выйдет. Тот же дух исследования и одержимость программированием привели 18-летнего Мэтта к работе в местной организации в Мансфилде (Великобритания), где он начал создавать веб-сайты и другие онлайн-сервисы.
После нескольких лет работы с различными технологиями в разных областях не только в Лондоне, но и по всему миру Мэт обратил внимание на новый язык системного программирования под названием Go, впервые использованный в Google. Поскольку Go решал очень актуальные и остросовременные технические проблемы, Мэт начал использовать этот язык для решения задач, когда Go находился еще на стадии бета-тестирования, и с тех пор продолжает программировать на нем. Мэт работал над разными проектами с открытым исходным кодом, создал несколько пакетов Go, в том числе Testify, Moq, Silk и Is, а также инструментарий для разработчиков в MacOS — BitBar.
С 2018 года Мэт — соучредитель компании Machine Box, но он по-прежнему принимает участие в конференциях, пишет о Go в своем блоге и является активным участником сообщества Go.
» Более подробно с книгой можно ознакомиться на сайте издательства
» Оглавление
» Отрывок
Для Хаброжителей скидка 25% по купону — Golang
По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
12 книг для изучения языка программирования Go
Golang или Go — относительно новый язык, который ориентирован на многопоточность. Его в 2009 году запустил концерн Google. На Западе он уже обрёл свою популярность и занял нишу среди других языков, но до нас толком не дошёл. Лишь сейчас начинаются попытки его освоения. Это видно даже по скудности выбора литературы для изучения. Из-за этого большая часть представленных учебников будет только на английском языке.
Программирование на языке Go
Перед языком Golang ставилась цель максимально использовать заложенную мощность в многоядерные процессоры. Марк Саммерфильд продемонстрирует вам возможности языка, идиомы и способы написания программ. В книге собрана вся информация, нужная для создания функциональных и работающих приложений. Автор показывает преимущества Go перед другими языками, указывая на ключевые особенности. Марк в этой книге продемонстрирует вам тонкости параллельного программирования, применение динамической типизации и прочие плюшки.
Книга подойдёт и новичкам и тем, кто уже имеет некоторое представление о Go.
Go на практике
Расчёт идёт на опытных программистов, использующих этот язык. Книга — свод рецептов по решению типовых вопросов, возникающих при создании приложения или программы. Пособие построено по принципу «вопрос-решение-обсуждение». Книга показывает концепцию языка, демонстрирует приемы, тестирование и отладка, маршрутизацию и прочие возможности. Также затронут вопрос о создании облачных приложений.
Язык программирования Go
Книга универсальная и подойдёт как новичкам, так и уже имеющим какие-то знания по языку. Хотя, проще в ней будет ориентироваться более опытным программистам. Книга поможет также освоить язык, если вы до этого работали с другими. Здесь описаны его плюсы, зачем вообще создавался Go, узнаете, как писать эффективно и идиоматично.
Авторы — профессионалы в двух областях: программировании и написании учебного материала. Тут приведены примеры решения практических вопросов, приемы, облегчающие написание кода и т.д.
Go in action
Пособие рассчитано на тех, кто владеет основами языка Go. Go in action проведет вас от начинающего программиста к маэстро, виртуозно управляющим кодом Golang. Авторы с первых страниц погружают вас в особенности и концепции языка, а затем постепенно подводят к получению опыта практическим путем.
Задания, предлагаемые книгой, – это веб-ресурсы, серверы и приложения. В процессе программирования вам поведают о методах манипулирования, преобразования данных и прочих фишках.
Introducing Go
Миниатюрная книжка в 62 страницы. Казалось бы, что можно понять из такого маленького объема? Но, если у вас есть опыт работы с другими языками, то это пособие быстро проведет вас по азам Go и поможет вам определиться, нужен ли вам он или лучше поискать что-то иное. А вторым доводом в пользу книги идет тот факт, что она от O’Really.
Книга пошагово знакомит с языком, в конце каждой главы есть задания для усвоения материала. Главы короткие, лаконичные, но понятные и простые. Все идет по принципу цепочки. Так что перескочить с одного на другое не получится, да и малый объем не позволит это сделать.
Get Programming with Go
Книга для новичков. Она поможет освоить азы языка за 32 урока. Пособие разбито на 7 модулей, которые познакомят с языком. Последний блок уроков откроет дверь в параллельное программирование на Go.
Учебник обучит вас синтаксису языка, даст множество заданий для самостоятельной работы. Все задания можно выполнять в тестовой среде.
Go Programming by Example
Обучение программированию происходит на примерах кода реально работающих приложений и ресурсов. Удобно, ведь сразу запоминается синтаксис, манера кодить и сами особенности языка. Рассматриваемых тем в книге масса, и вот некоторые из них: среда разработки, массивы, функции, указатели, структуры, методы, программирование сокетов, баз данных и много других.
The Go Bestiary
Это не учебник, а, скорее, сборник советов и рекомендаций, собранных воедино. Здесь вы найдете способы структурировать свои проекты, увидите распространенные и нежелательные ошибки. Это учебное пособие рассчитано на более опытных программистов, но и тем, кто работал с другими языками, будет полезна изложенная здесь информация.
Learning Go Programming
Это пошаговое практическое руководство, которое поможет вам быстро начать работу с Go. Начнете с изучения основ Go, затем продолжим детальным описанием типов данных Go. После этого вы узнаете, как использовать идиомы параллелизма, чтобы избежать подводных камней и создавать программы, которые точно соответствуют ожидаемому поведению. Наконец, вы сможете использовать некоторые из наиболее важных функций GO, такие как сетевое программирование и интеграция с ОС, для создания эффективных приложений. Все концепции объясняются в четкой и сжатой форме.
Network Programming with Go
А вот книга для матерых программистов на Go. Вам предстоит погрузиться в важные аспекты сетевой архитектуры и Go, такие как сериализация данных, протоколы уровня приложений. Кроме основ, сетевое программирование охватывает ключевые вопросы по HTTP и HTTPS, шаблонам, удаленным вызовам процедур (RPC) и т.д.
Кроме того, автор Ян Ньюмарч поможет вам в создании и подключении к полноценному веб-серверу на основе Go. Эта книга может служить как важным учебным пособием, так и справочным материалом по сетям Go.
Mastering Concurrency in Go
Учебник расскажет вам о параллелизме, о том, как Go использует ее, о возможностях и структурах ядра параллелизма Go. На каждом этапе в книге будут представлены реальные, полезные фрагменты кода с подробным описанием используемых методов. К концу вы будете чувствовать себя уверенно, создавая безопасное, согласованное с данными, высокопроизводительную параллельную программу.
Цель этой книги — показать, как можно использовать Go для создания высокопроизводительных, надежных параллельных программ с уникальной формой многопоточности, в которой применяются процедуры, связывающиеся и синхронизирующиеся по каналам.
Mastering Go Web Services
Этот учебник познакомит вас с главными моментами проектирования, создания и развертывания веб-службы с применением идиоматических методов REST с акцентом на быструю, безопасную и гибкую работу. Первым делом вы создадите свой API с пакетом HTTP. Вы будете смотреть на создание и сборку вашего приложения, включая популярные структуры дизайна. Вы также увидите способы развертывания кода для подготовки и разработки. Наконец, вы увидите, как функции безопасности в Go могут использоваться для защиты от внедрения SQL-кода и компрометации конфиденциальных данных.
К концу этой книги вы достигнете высокого уровня мастерства в создании и развертывании веб-сервисов и веб-API с помощью Go.
Какую книгу по go выбрать? — Хабр Q&A
Лично мне категорически не понравилась книга:Язык программирования Go (Алан А. А. Донован, Брайан У. Керниган )
Прочёл её в оригинале на английском языке и могу сказать: это просто верх бездарности — данная книга. Она поразительно неуклюжа внутри. Объяснение материала вызывает постоянное раздражение своей нелогичностью, непоследовательностью — какие-то рваные куски логического мышления. Хочется просто обматерить авторов. А ведь при желании как просто, хорошо и удобно можно было бы изложить и объяснить весь материал. Но нет — у авторов явно нет такого желания — хотя, скорее, у них просто тараканы в голове. Даже английский язык авторов и то плох — своей корявостью — в сравнении с другими англоязычными учебниками. Настолько, что порой приходилось подглядывать в русский перевод данной книги (выполненный, кстати, очень качественно) — чего я никогда не делаю (я всё читаю только в оригинале, даже если есть перевод — потому что перевод всегда искажает смысл).
Читая данную книгу, я постоянно чувствовал себя мышью, которая кололась, но всё равно жрала кактус.
Дико бесит их манера объяснять простое максимально сложным способом, а также объяснять вещи при помощи незнакомого материала (который будет объяснён в лучшем случае позже в книге — а то и вовсе не объяснён).
Или такая вещь — сначала идёт текстовое объяснение сути работы куска кода — и лишь ПОТОМ идёт сам этот кусок кода. Во то время как сначала надо приводить код — а лишь потом его текстовое объяснение. Это раздражает — и такая нелепица — в большом и в малом. Некоторые важные мелочи вообще не объясняются (остаются за кадром) — авторы забывают о том, что человеку это может быть неизвестно/непонятно. Ход изложения материала недостаточно последовательный. Слишком много громоздких и чересчур сложных примеров. Короче, сплошной идиотизм. Авторы органически неспособны излагать учебный материал в правильной форме. И это при том, что (вроде бы) один из них находился в команде разработчиков языка. Но, как видно, это ещё не значит, что он способен адекватно объяснить язык Go. Целые куски глав со сложными примерами приходится, скрипя зубами, пропускать (при чтении). Часть примеров бессмысленно переусложена — и зачем-то дублирует уже объяснённый материал.
Как говорил Задорнов — «ну тупые они, тупые» — трудно подобрать более точную характеристику к авторам данной книги.
Оба варианта — доступны бесплатно в электронном виде в PDF, русский, правда, только как скан (что неудобно, хоть скан этот и весьма приличного качества). Меня ещё смешит запредельно-грабительская цена на русский перевод книги, не вздумайте выкидывать деньги на это барахло.
В итоге — книга прочитана — но я чувствую, что систематических знаний по Go у меня как не было, так и нет. Так, какие-то жалкие обрывки. Надо теперь что-то иное читать. Убил бы авторов.
30 лучших книг для освоения языка программирования Go
Ищете книги по Go? Представляем 30 книг для освоения языка программирования Go, которые ответят на вопросы новичков и уверенных разработчиков.
Эта книга — бесплатное введение в Golang. Предназначена для разработчиков, которых не устраивает идея указателей и статической типизации. На самом деле, это больше, чем просто «маленькая книга»: название доказательств о простоте изложения.
Книга является кратким введением в язык Go. Разработанный «гуглом», это язык программирования общего назначения с современными функциями, чистым синтаксисом и надежной библиотекой, что делает его идеальным для изучения в качестве первого языка программирования.
Изначально книга появилась в качестве пособия к мероприятию, но в ней также есть полезный контент от Google и создателей в соответствии с лицензией Creative Commons Attribution 3.0, а также код, лицензированный в соответствии с BSD.
Онлайн-учебник для начинающих. Содержит множество упражнений по разным темам языка программирования Go.
Книга, с помощью которой JavaScript-e может легко перейти на Gо. В книге рассмотрены отличия между языками в облегчении перехода с одного языка на другой.
С этой книгой заинтересованный новичок сможет стать гуру. Сначала вводит описание концепций и языков, что позволит приступить к практическому написанию приложений, в том числе веб-сайтов, сетевых серверов, обработчиков информации.В самом конце книги рассмотрены секретные штуки, к примеру, вы узнаете про интеграцию Gо и C.
В этой книге показано, как создать мощные системы и применить в реальной задаче. Плюсами программ, созданных на этом языке программирования, являются масштабируемость, производительность и доступность. Уроки, изложенные автором, воспользуйтесь всеми преимуществами при написании.
На сегодняшний день Gо — один из самых впечатляющих языков новых программирования.Изначально он создавался для того, чтобы задействовать всю мощь современных многоядерных процессоров. В этом приложении автор показывает, как писать программы, в полной мере использующие его революционные возможности идиомы.
Книга не предварительное изучение Перейти или опыта работы с каким-либо конкретным языком, поэтому она подойдет как «чайникам», так и тем, кто привык писать на других языках.
Исходный код свободно доступ для загрузки с сайта дополнительного книги.
Прочесть эту книгу — хорошее решение для начинающих, знакомых с основами программирования. Практическое руководство обеспечивает легкое введение в язык. Автор раскрывает основные функции языка с пошаговыми инструкциями и упражнениями в каждой главе, которые помогут вам практиковать то, чему вы учитесь.
Изучив более 25 глав этой книги, вы быстро научитесь программировать на новом языке. Большинство примеров из этой книги можно выполнить на тестовой среде, поэтому вам не нужно беспокоиться о создании практической среды.Вместо выполнения скучных заданий придётся поиграть, если вам, конечно, это по душе.
Эта книга поможет вам начать работу с программированием на Gо. В ней описываются все элементы языка и иллюстрируется их использование с примерами кода.
Изучайте Gо, решая проблемы. Каждый рецепт является полноценным решением проблемы практического программирования. Помимо классических тем, в инициативе работа с данными посредством NoSQL, MongoDB и RethinkDB.Кроме того, здесь подробное руководство по созданию масштабируемых интерфейсов API для ваших мобильных и веб-приложений.
Книга охватывает спецификации, документацию, блоги, видео, слайды и авторские впечатления от написания. Здесь есть всё необходимое для глубокого понимания языка.
Краткое руководство по разработке тестов. Доступна только онлайн.
Эта охватывает сетевую город обозревает язык.Погрузитесь в ключевые темы сетевой архитектуры: сериализацию данных, протоколы, символы и кодировки.
Помимо базовых принципов, охватывает проблемы в области сетей и безопасности: HTTP и HTTPS, шаблоны, удаленный вызов процедур (RPC), веб-сокеты, включая HTML5 и многое другое.
Эта книга проведет вас через историю параллелизма, расскажет о его использовании в Gо, отличии от других языков, а также об особенностях механизма параллелизма. В каждой главе представлены реальные примеры с подробными описаниями методологий.К концу вам будет комфортно создавать безопасные, совместимые, высокопроизводительные приложения.
Этот практический справочник объясняет стратегии, которые можно использовать в своих повседневных приложениях. Вы изучите методы создания веб-сервисов, использование Gо в облаке, тестирование и отладку, маршрутизацию, сетевые приложения и т. д.
Записная книжка Gо-разработчика.
Примеры показывают решения наиболее частых проблем при разработке, чтобы научиться разрабатывать качественное ПО.Вы изучите специфику работы со строками Голанга, коллекциями, массивами, обработкой ошибок, горутинами, срезами, картами, формами, датами, временем, файлами, сетями, веб-приложениями и временем выполнения.
Изучите шаблоны проектирования для упрощения разработки.
Создавайте отзывчивые приложения с Gоlang.
Ресурс для всех, кто желает научиться создавать Gо-приложения для веба.
Еще одна потрясающая книга для изучения веб-разработки.
Автор знакомит с наиболее важными аспектами проектирования, создания и развертывания веб-сервиса с использованием методов REST, уделяет особое внимание скорости, безопасности и гибкости. Вы начнете создание своего первого API в Gо посредством HTTP, займитесь проектированием приложения, узнаете о Model-View-Controller, поймете методы развертывания кода и рассмотрите возможности языка по части безопасности.
В этой существующей основные понятия: языковые структуры, стандартные библиотеки и инструменты.Также рассказывается о более продвинутых функциях, таких как такие концепции концепелизма, методологии тестирования и структуры пакетов.
После прочтения вы будете знать, как структурировать, эффективно использовать параллелизм и передовые методы тестирования.
Книга создание веб-приложений, с использованием современных принципов проектирования. Здесь собрана куча примеров по таким темам, как запросы обработки и отправка ответов, механизмы шаблонов, параллелизм, тестирование и развертывание веб-приложений.
Книга для тех, кто немного знаком с Gо и веб-разработкой. Мы (вы) создадим веб-приложения без использования сторонних структур и с минимальным использованием исходных библиотек. Сможете научиться разработке с нуля.
Вместо банальных вещей в этой книге показывается, как создать полезные приложения, такие как Pixieset, с нуля. Книга рассчитана на новичков.
Бесценный ресурс, который учитывает работу с наиболее полезными функциями языка программирования Gо.
Мы что-то упустили? Вы знаете не менее полезные книги по Go, которые не были затронуты в статье? Напишите нам о них, и они войдут в нашу следующую подборку 🙂
Другие материалы по языку программирования Go:
.12 книг для изучения языка программирования Go
Golang или Go — относительно новый язык, который ориентирован на многопоточность. Его в 2009 году запустил концерн Google. На Западе он уже обрёл свою популярность и занял нишу среди других языков, но до нас толком не дошёл, — пишет KV.BY. Лишь сейчас начинаются попытки освоения этого языка. Это видно даже по скудности выбора литературы для изучения. Из-за этого большая часть представленных учебников будет только на английском языке.
Программирование на языке Go
Перед языком Golang ставилась цель максимально использовать заложенную мощность в многоядерные процессоры. Марк Саммерфильд предоставляет вам возможности языка, идиомы и способы написания программ. В книге собрана вся информация, нужная для создания функциональных и работающих приложений. Автор показывает преимущества Go перед другими языками, используя ключевые особенности. В этой системе происходит моделирование параллельного программирования, применение динамической типизации и прочих плюшки.
Книга подойдёт и новичкам и тем, кто уже имеет представление о Go.
Перейти на практику
Расчёт идёт на опытных программистов, использующих этот язык. Книга — свод рецептов по типовым вопросам, возникающим при создании приложения или программы. Пособие построено по принципу «вопрос-решение-обсуждение». Книга показывает концепцию языка Go, демонстрирует приемы, тестирование и отладка, маршрутизацию и прочие возможности. Также затронут вопрос о создании облачных приложений.
Язык программирования Go
Книга универсальная и подойдёт как новичкам, так и уже имеющим какие-то знания по языку. Хотя, проще в ней будет ориентироваться более опытным программистам. Книга поможет также освоить язык, если вы до этого работали с другими. Здесь вы его плюсы, зачем вообще создавался Go, узнаете, как писать эффективно и идиоматично.
Авторы — профессионалы в двух областях: программирование и написании учебного материала.Тут приведены примеры решения практических вопросов, приемы облегчающие написание и т.д.
Перейти в действие
Пособие рассчитано на тех, кто владеет основами языка Go. Вступите в действие проведет вас от начинающего программиста к маэстро, виртуозно управляющим кодом Голанг. Авторы с первых погружают вас в особенности концепции и языка, а затем подводят к получению опыта практическим путем.
Задания, предлагаемые книгой, — это веб-ресурсы, серверы и приложения.В процессе программирования вам поведают методы манипулирования, преобразования данных и прочих фишках.
Знакомство с Go
Миниатюрная книжка в 62 страницы. Казалось бы, что можно понять из такого маленького объема? Но, если у вас есть опыт работы с другими языками, то это пособие быстро проведет вас по азам, Go и поможет вам определить, нужен ли вам он или лучше поискать что-то по данным. А вторым доводом в пользу книги идет тот факт, что она от O’Really.
Книга пошагово знакомит с языком, в конце каждой есть главы задания для усвоения материала. Главы короткие, лаконичные, но понятные и простые. Все идет по принципу цепочки. Так что перескочить с одного на другое не получится, да и малый объем позволит это сделать.
Программирование с помощью Go
Книга для новичков. Она поможет освоить азы языка Go за 32 урока. Пособие разбито на 7 модулей, которые знакомят с языком. Последний блок уроков откроет дверь в параллельное программирование на Go.
Учебник обучит вас синтаксису языка, даст множество заданий для самостоятельной работы. Все задание можно выполнять в тестовой среде.
Программирование на Go на примере
Обучение программированию происходит на примерах кода работающих приложений и ресурсов. Удобно, ведь сразу запоминается синтаксис, манера кодить и сами особенности языка. Рассматриваемые тем в книге масса, и вот некоторые из них: среда разработки, массивы, функции, указатели, структуры, методы, программирование сокетов, баз данных и много других.
Бестиарий Го
Это не учебник, а, скорее, сборник советов и рекомендаций, собранных воедино. Здесь вы найдете способы структурировать свои проекты, распространенные и нежелательные ошибки. Это учебное пособие рассчитано на более опытных программистов, но и тем, кто работал с другими языками, будет полезна изложенная здесь информация.
Обучение программированию на Go
Это пошаговое практическое руководство, которое поможет вам быстро начать работу с Go.Начните изучение основ языка Go, затем продолжите знакомиться с детальным описанием данных Go. Вы узнаете, как использовать идиомы параллелизма, чтобы избежать подводных камней и программ, которые точно соответствуют ожидаемому поведению. Наконец, вы сможете использовать некоторые из наиболее важных функций GO, такие как сетевое программирование и интеграция с ОС, для создания эффективных приложений. Все описываются в четкой и сжатой форме.
Сетевое программирование с помощью Go
А вот книга для матерых программистов на Go.Вам предстоит погрузиться в важные аспекты сетевой архитектуры и Go, такие как сериализация данных, протоколы уровня приложений. Кроме того, сетевое программирование охватывает ключевые вопросы по HTTP и HTTPS, шаблонам, удаленным процедурам (RPC) и т.д.
Кроме того, автор Ян Ньюмарч поможет вам в создании и подключении к полноценному веб-серверу на основе Go. Эта книга может быть как важным учебным пособием, так и справочным инструментом по сетям Go.
Освоение параллелизма в Go
Учебник расскажет вам о параллелизме, о том, как Go использует ее, о возможностях и структурах параллелизма Go.На каждом этапе представлены реальные, полезные фрагменты кода с подробным описанием используемых методов. К концу вы будете чувствовать себя уверенно, создавая безопасное, согласованное с данными, высокопроизводительную параллельную программу.
Цель этой книги — показать, как можно использовать Go для создания высокопроизводительных, надежных параллельных программ с уникальной многопоточностью, в которой применяются процедуры, связывающиеся и синхронизирующиеся по каналам.
Освоение веб-сервисов Go
Этот учебник познакомит вас с главными моментами проектирования, создания и развертывания веб-службы с применением идиоматических методов REST с акцентом на быструю, безопасную и гибкую работу. Первым делом вы создадите свой API с пакетом HTTP. Вы будете смотреть на создание и сборку вашего приложения, включая популярные структуры дизайна. Вы также способы развертывания кода для подготовки и разработки. Наконец, вы увидите, как функции безопасности в Go Programme Programme от установщика SQL-кода и компрометации конфиденциальных данных.
К концу книги вы достигли высокого уровня мастерства в создании и развертывании веб-сервисов и веб-API с помощью Go.
.Какую литературу можно найти по golang? — Хабр Q&A
Я бы рекомендовал изучение в такой инструктор:Начальный уровень (синтаксис языка):
1. Начать с golang-book.ru. Это на русском и довольно неплохо для начинающего.
2. https://golang.org/doc/effective_go.html — это уже на английском, но всё равно толково и хорошо заходит после 1-го пункта. Кратко, по делу, без воды, достаточно понятно.
После прочтения этих пунктов у Вас уже будут базовые понятия о языке.
Промежуточный уровень (параллелизм — многопоточность):
Как ни пытался, не смог определить какую-то конкретную универсальную книгу. На этом уровне много плохих книг, сложно что-то хорошее. Относительно неплохими для этого уровня (пока что )ались:
(продолжаем последовательное изучение Go по пунктам):
3. Базовый веб-сервер на Go Статья, без чего дальнейшее трудно заходит (книгоавторам всем дружно лень такое нормально объяснить).
4. М. Кертис — Повышайте уровень своих веб-приложений с помощью Go
Читал — и не понимал — что происходит? Чувак явно пишет рельсы на Go! Всё такое до боли знакомое … Что такое? А потом смотрю в профиле https://www.linkedin.com/in/mal-curtis/ — так он же пишет на работе на Ruby on Rails! Так что книжка отлично зайдёт рельсовикам, осваивающим Go. Книга неплохая, автор явно старался. Автор, ты хороший человек.
5. К. Кокс-Будай — Параллелизм в Go. Инструменты и методы для разработчиков. Книга не очень удачная, но пока я не успел найти что-то получше.Автор — женщина, и глупая. Книга читается мучительно и крайне медленно. Охват материала неплох — но объяснения косноязычные, с водопадом лишних слов и эмоций, примеры кода неоправданно переусложнены, ряд тем вообще остались непонятыми, если бы не гугление. Читаю и матерюсь на каждый шагу.
PS Последние 2 главы пошёл уже такой горячечный бред, что я просто не смог заставить себя читать этот ужас. Бросил. В общем, далее параграфа Очередь читать не стоит. Книга прекрасно иллюстрирует тезис, какими бы умными ни были женщины, они всё равно дуры, и нечего им в программировании делать (кроме того что 1С).
К сожалению, книгу прочесть всё-таки надо, охват хорош — а заменить книгу нечем (в смысле другой книгой, продаваемой за деньги — разве что статьями).
Есть ещё книга Н. Козыра — Освоение параллелизма в Go — но у нее ужасные отзывы — да и я пытался читать другую книгу по Go у этого же автора — и мне также очень не понравилось.
Смешно сказать — но по Go нет ни одной путёвой книги про Concurrency (единственное, ради чего Go был создан)!
6. Лучшее объяснение Go Context, что я пока видел.Оно даже лучше официального (написанного индусом и от плохого).
7. М. Цукалос — Освоение го — но только Глава 10: Параллелизм в го — Продвинутые темы — и исключая параграф пулы рабочих (он ошибочный — там ничто не сдерживает размножение горутин — какой же тогда это пул).
Средне-удовлетворительная глава, звёзд с небес не хватает, интереснее всего был параграф Разделение памяти с помощью горутин — частный пример Катькиного Confinement’а.
Продвинутый уровень (микросервисы на Go):
Я пытался читать Н.Джексон — Создание микросервисов с помощью Go — это оказалось невозможным, книгу написал какой-то сумасшедший безумец, находящийся в состоянии наркотического опьянения. Отзывы на Амазоне это подтверждают.
Также я попытался читать M. Ryer — Go Programming Blueprints (2-е изд) — только главу Глава 10: Микросервисы в Go с Go Kit Framework — не понравилось. Примеры сложного кодановаты (автор пытается построить реальную систему — ну и дурак — вместо того, чтобы ограничить демо-примером), объяснения сопутствующего материала никакие (по сути, их нет).Бесполезная глава. Несколько тем свалены вместе — но ни одна толком не объяснена. Очень слабенький автор.
Вердикт: нормальные книжки по теме «Go микросервисы» пока не обнаружено. Придётся изучать эту тематику из статей и инструкций по использованию микросервисных Go-фрэймворков — вот списочек фрэймворков:
Я начал с gRPC. Сначала прочёл официальную доку по protobuf (включая раздел о Go). Дока оказалась достаточно вменяемой. Но зато официальная дока по gRPC уже оказалась совершенно паршивой.Там 2 пример — попроще и посложней. Писали доку явно последователи тех, кто писал доку к первому ангуляру (т.е. те, кому я бы отрубил руки по самым плечи). Понять что-либо без исходников (к статье) — нереально. Но — исходники ещё надо найти, ибо в статье ссылки на них … нет. Оказалось, исходники тут: https: //github.com/grpc/grpc-go/tree/master/exampl …. Но даже с ними — всё довольно непросто понять — даже в простейшем примере. Потому что авторы умолчали о многих важных моментах. Т.к. им в падлу шевельнуть задницей лишний раз.В общем, есть нуждающиеся в нормальном авторе, кто опишет, что такое gRPC. Попробуйте почитать статью от Шизы — это слегка окультуренный сокращённый пересказ сложного случая.
Рассмотрим Go Micro. Продукция очередной кретин (да ещё и спорное качество). Что, скажите, можно понять из таких «объяснений»? Кстати, ищите в Яндексе термин «Service Discovery» — здесь нужно понимать, что это. Посмотрите и Консул. Вот ещё разумная статья о Go-микросервисах. И ещё я понял — без предварительного изучения protobuf и gRPC понять Go Micro будет затруднительно (если вообще возможно).Желаю вам никогда не встретить на работе этой дегенерата. Go Micro показался мне китайским фонариком со встроенными компасом, радиоприёмником, часами, зарядкой, отвёрткой, точилкой для карандашей, ногтерезкой и т.д.
Идём дальше. Go kit производит намного более лучшее впечатление. Правда, документация не полная — автору не хватило терпения её закончить. Но всё же разобраться можно — есть исходники-примеры, снабженные подробными комментариями. Автор мне понравился.
Почитайте полезную статью-сравнение.
Приложение:
Гоняться за русскоязычными книгами по Голангу не рекомендую. Я прочёл на русском:
— А. Донован, Б. Керниган — Язык программирования Go
Это совершенно отвратительная бездарная книга.
и просмотр оглавление русскоязычной книги:
— М. Саммерфильд — Программирование на языке Go
Хотя я её не читал, но беглый просмотр её негативного оглавления создаёт самоеное впечатление о книге. Такое ощущение, что это целенаправленная диверсия против изучающего голанга, с целью развести его на время (прочтения) и (при покупке).Марк Саммерфилд — это профессиональный графоман, посмотрите сами на его карьерный путь: https://www.linkedin.com/in/qtrac/
Обе перечисленные книги (доступные онлайн бесплатно в электронном виде в формате PDF), хотя и русскоязычные,,, не рекомендую.
М. Батчер, М. Фарина — Перейти на практике — in English — книга вроде бы достаточно неплохая, но она для опытного разработчика — и она не излагает системно — а отрывисто.
Пытаться читать спецификацию языка также не рекомендую — ничего не поймёте:
https: // golang.org / ref / spec
Заключение
Нормальной литературы по Go практически нет (кроме азов). Все микросервисные Go-фрэймворки плохо документированы, вынуждая разбираться в них по примерам с исходниками (!).
Англоязычных книг по Голангу в электронном виде бесплатно — много, более 30 (а то и под 50). Многие написаны индусами, или оторванными от жизни вузовскими преподами, или какими-то левыми любителями Go (у таких «книг» даже нет ISBN). Есть даже книги, написанные неграми! Все такие книги требуют осторожного выбора.Почему именно Go вызвал у окружающих непреодолимые позывы к графоманству? Такое впечатление, что многие авантюристы решили «срубить баблишка» на «хайповой» теме. Действительно, найти хотя бы нормальную книгу (не говоря уже о непросто) — оказывается по факту крайне неросто — почему-то хорошей хорошей негодяи и бездари — как ни в каком ином языке программирования.
Всё, о чём я рассказал в этом посте, доступно бесплатно онлайн в электронном виде (Либген, к примеру).
В общем-то уделить особое внимание при изучении Go следует использовать его возможности по многопоточности (concurrency), которые включают низкоуровневые механизмы (как в C ++) типа мьютекса и высокоуровневые механизмы типа каналов. Собственно, это как раз то самое, зачем пойти вообще понадобился. Вторая по значимости тема в Go, как мне кажется, это микросервисы.
.Многопоточность — Введение в программирование на Go
Очень часто, большие приложения состоят из множества подпрограмм. Например, web-принимает серверы запросов от и отправляет HTML страницы в ответ. Каждый такой запрос выполняется как отдельная небольшая программа.
Такой способ идеально подходит для подобных приложений, так как обеспечивает возможность одновременного запуска множества более мелких компонентов (обработки нескольких запросов одновременно, в случае веб-сервера).Одновременное выполнение более чем одной задачи известно как многопоточность. Go имеет богатую функциональность для работы с многопоточностью, в частности, такие инструменты как горутины и каналы.
Горутины
Горутина — это функция, которая может работать параллельно с другими функциями.
Для создания горутины используется ключевое слово go
, за которое следует
вызов функции.
пакет основной
импорт "fmt"
func f (n int) {
для i: = 0; я <10; i ++ {
fmt.Println (n, ":", i)
}
}
func main () {
иди ж (0)
строка ввода var
fmt.Scanln (& ввод)
}
Эта программа состоит из двух горутин. Функция основная
, сама по себе, является
горутиной. Вторая горутина создаётся, когда мы вызываем go f (0)
. Обычно при
вызове функции, программа выполнит все конструкции внутри вызываемой функции, а
только потом перейдет к следующей после выполнения, строка. С горутиной программа
немедленно прейдет к следующей строке, не дожидаясь, пока вызываемая функция
завершится.Вот почему здесь присутствует вызов Scanln
, без него программа
завершится еще перед тем, как ей удастся вывести числа.
Горутины очень легкие, мы можем создать их тысячами. Давайте изменим программа так, чтобы она запускала 10 горутин:
func main () {
для i: = 0; я <10; i ++ {
иди ф (я)
}
строка ввода var
fmt.Scanln (& ввод)
}
При запуске вы наверное заметили, что все горутины выполняются
последовательно, а не одновременно, как вы ожидали.Давайте добавим
небольшую задержку функции с помощью функций time.Sleep
и rand.Intn
:
пакет основной
импорт (
"fmt"
"время"
"математика / ранд"
)
func f (n int) {
для i: = 0; я <10; i ++ {
fmt.Println (n, ":", i)
amt: = time.Duration (rand.Intn (250))
time.Sleep (время.Миллисекунды * amt)
}
}
func main () {
для i: = 0; я <10; i ++ {
иди ф (я)
}
строка ввода var
fmt.Scanln (& ввод)
}
f
выводит числа от 0 до 10, ожидая от 0 до 250 мс после каждой операции
выводы.Теперь горутины должны одновременно работать.
Каналы
Каналы возможности общения нескольких горутин друг с другом, чтобы синхронизировать их выполнение. Вот пример программы с использованием каналов:
пакет основной
импорт (
"fmt"
"время"
)
func pinger (c chan string) {
для i: = 0; ; i ++ {
c <- "пинг"
}
}
func printer (c chan string) {
за {
msg: = <- c
fmt.Println (сообщение)
time.Sleep (время.Второй * 1)
}
}
func main () {
var c chan string = make (chan string)
иди пингер (с)
иди принтер (с)
строка ввода var
fmt.Scanln (& ввод)
}
Программа будет постоянно выводить «ping» (нажмите, чтобы её остановить).
Тип канала представлен ключевым словом chan
, за которым следует тип, который
будет передаваться по каналу (в данном случае мы передаем строки). Оператор <-
(стрелка влево) используется для отправки и получения сообщений по каналу.Конструкция c <- "ping"
означает отправку "ping"
, а msg: = <- c
- его
получение и сохранение в переменную msg
. Строка с fmt
может быть записана
другим способом: fmt.Println (<- c)
, тогда можно было бы удалить предыдущую
строку.
использование двух каналов позволяет синхронизировать горутины. Когда pinger
пытается послать сообщение в канал, он ожидает, пока printer
будет
готов получить сообщение.Такое поведение называется блокирующим. Давайте
добавим ещё одного отправителя сообщений в программу и посмотрим, что будет.
Добавим эту функцию:
func ponger (c chan string) {
для i: = 0; ; i ++ {
c <- "понг"
}
}
и изменим функцию основная
:
func main () {
var c chan string = make (chan string)
иди пингер (с)
пойти в понгер (с)
иди принтер (с)
строка ввода var
fmt.Scanln (& ввод)
}
Теперь программа будет выводить на экран то ping
, то pong
по очереди.
Направление каналов
Мы можем направить направление передачи сообщений в канале, сделав его только
отправляющим или принимающим. Например, мы можем изменить функцию Pinger
:
func pinger (c chan <- строка)
и канал c
будет только отправлять сообщение. Попытка получить сообщение из
канала c
вызовет ошибку компилирования. Также мы можем изменить функцию принтер
:
func printer (c <-chan строка)
Существуют и двунаправленные каналы, которые могут быть переданы в функции, принимающие только принимающие или отправляющие каналы.Но только отправляющие или принимающие каналы не могут быть переданы в функцию, требующую двунаправленного канал!
Оператор Выбрать
На языке Go есть специальный оператор select
который работает как switch
, но
для каналов:
func main () {
c1: = make (строка chan)
c2: = make (строка chan)
go func () {
за {
c1 <- "от 1"
time.Sleep (время.секунда * 2)
}
} ()
go func () {
за {
c2 <- "из 2"
время.Сон (время, секунда * 3)
}
} ()
go func () {
за {
Выбрать {
case msg1: = <- c1:
fmt.Println (msg1)
case msg2: = <- c2:
fmt.Println (msg2)
}
}
} ()
строка ввода var
fmt.Scanln (& ввод)
}
Эта программа выводит «из 1» каждые 2 секунды и «из 2» каждые 3 секунды.
Оператор выберите
выбирает первый готовый канал, и получает сообщение от него,
или же передает сообщение через него.Когда готовы несколько каналов, получение
сообщения происходит из случайно выбранного готового канала. Если же ни один из
каналов не готов, оператор блокирует ход программы до тех пор, пока какой-либо
из каналов будет готов к отправке или получению.
Обычно select
используется для таймеров:
выбрать {
case msg1: = <- c1:
fmt.Println ("Сообщение 1", msg1)
case msg2: = <- c2:
fmt.Println ("Сообщение 2", msg2)
case <- time.After (time.Second):
fmt.Println ("тайм-аут")
}
раз После
создаёт канал, по которому посылаем метки времени с заданным
интервалом. В данном случае мы не пользуемся в значениях временных меток,
поэтому мы не сохраняем его в переменные. Также мы можем задать команды, которые
выполняются по умолчанию, используя конструкцию по умолчанию
:
выбрать {
case msg1: = <- c1:
fmt.Println ("Сообщение 1", msg1)
case msg2: = <- c2:
fmt.Println ("Сообщение 2", msg2)
case <- время.После (время. Второе):
fmt.Println ("тайм-аут")
дефолт:
fmt.Println («ничего не готово»)
}
Выполняемые по умолчанию команды исполняются сразу же, если все каналы заняты.
Буферизированный канал
При инициализации канала можно использовать второй параметр:
и мы получим буферизированный канал с ёмкостью 1
. Обычно каналы работают
синхронно - каждая из сторон ждёт, когда другая сможет получить или передать
сообщение. Но буферизованный канал работает асинхронно - получение или отправка
сообщения не заставляют останавливаться.Но канал теряет пропускную
способность, когда он занят, в данном случае, если мы отправим в канал 1
сообщение, то мы не сможем отправить туда ещё одно до тех пор, пока первое не
будет получено.
Задачи
Как задать направление канала?
Напишите функцию
Сон
, используяраз. После
Что такое буферизированный канал? Как создать такой канал с ёмкостью в 20 сообщений?