#статья
Планировщик Go
Пожалуй, лучшие статьи про устройство планировщика из всех, что я встречал.
Состоит из двух частей.
Оригинал (англ.): OS Scheduler и Go Scheduler
Перевод: Часть I — Планировщик ОС и Часть II — Планировщик Go
В первой части даются базовые основы планировщика ОС, необходимые для понимания основной темы: потоки, переключение контекста, кэш процессора и др.
Во второй уже непосредственно про планировщик Go: в деталях и с примерами разобрано переключение контекста между горутинами и различные нюансы.
Местами читается непросто, особенно для новичка, но оно того точно стоит.
Планировщик Go
Пожалуй, лучшие статьи про устройство планировщика из всех, что я встречал.
Состоит из двух частей.
Оригинал (англ.): OS Scheduler и Go Scheduler
Перевод: Часть I — Планировщик ОС и Часть II — Планировщик Go
В первой части даются базовые основы планировщика ОС, необходимые для понимания основной темы: потоки, переключение контекста, кэш процессора и др.
Во второй уже непосредственно про планировщик Go: в деталях и с примерами разобрано переключение контекста между горутинами и различные нюансы.
Местами читается непросто, особенно для новичка, но оно того точно стоит.
Ardan Labs
Scheduling In Go : Part I - OS Scheduler
Ardan Labs is trusted by small startups and Fortune 500 companies to train their engineers and develop business software solutions and applications.
#статья #структуры_данных #детали_реализации #тонкости_go
Хэш таблицы в Go. Детали реализации.
Статья начинается с небольшого ликбеза, а дальше самое интересное - подробности реализации Map в Go:
- как осуществляется инициализация, и почему без неё можно получить панику
- как map растёт, и почему порой лучше выделить память заранее (да, так можно поступать не только со слайсами)
- почему нельзя взять адрес значения
- как устроены бакеты
и др.
https://habr.com/ru/post/457728/
——
Кстати, если вы хотите узнать побольше про хэш-таблицы (без привязки к языку), то у меня на канале есть простое и понятное видео об этом: Хэш-таблицы за 10 минут.
Хэш таблицы в Go. Детали реализации.
Статья начинается с небольшого ликбеза, а дальше самое интересное - подробности реализации Map в Go:
- как осуществляется инициализация, и почему без неё можно получить панику
- как map растёт, и почему порой лучше выделить память заранее (да, так можно поступать не только со слайсами)
- почему нельзя взять адрес значения
- как устроены бакеты
и др.
https://habr.com/ru/post/457728/
——
Кстати, если вы хотите узнать побольше про хэш-таблицы (без привязки к языку), то у меня на канале есть простое и понятное видео об этом: Хэш-таблицы за 10 минут.
Хабр
Хэш таблицы в Go. Детали реализации
Порассуждаем об имплементации map в языке без дженериков, рассмотрим что такое хэш таблица, как она устроена в Go, какие есть плюсы и минусы данной реализации...
#статья #детали_реализации #тонкости_go #slice
Изменения функции append в Go 1.18
Небольшая заметка о том, как поменялась формула увеличения capacity среза при добавлении новых элементов в недавнем релизе Go 1.18.
Если вы знали, как это было устроено раньше - ваши знания чуток устарели, стоит обновить.
Если не знали, то для вас тут есть неплохой краткий ликбез об этом - будете знать.
Я бы не назвал это "must have" знанием, но полезно понимать нюансы работы языка под капотом.
Тем более, это статейка на 5-10 минут - можно осилить за чашечкой кофе ☕️
https://habr.com/ru/post/660827/
Изменения функции append в Go 1.18
Небольшая заметка о том, как поменялась формула увеличения capacity среза при добавлении новых элементов в недавнем релизе Go 1.18.
Если вы знали, как это было устроено раньше - ваши знания чуток устарели, стоит обновить.
Если не знали, то для вас тут есть неплохой краткий ликбез об этом - будете знать.
Я бы не назвал это "must have" знанием, но полезно понимать нюансы работы языка под капотом.
Тем более, это статейка на 5-10 минут - можно осилить за чашечкой кофе ☕️
https://habr.com/ru/post/660827/
Хабр
Изменения функции append в Go 1.18
Совсем недавно произошел релиз Go 1.18, гвоздем программы стали дженерики. Но про этот факт уже достаточно статей, а мне нечего к ним добавить. Однако, я не смог найти ни одного поста про этот кусочек...
Не совсем про Go, но для Go-разработчиков это супер-полезная штука.
Поймете на фундаментальном уровне, зачем нужен пакет sync, как с ним работать, и почему без них нельзя позволять нескольким горутинам работать с общим ресурсом.
Поймете на фундаментальном уровне, зачем нужен пакет sync, как с ним работать, и почему без них нельзя позволять нескольким горутинам работать с общим ресурсом.
Forwarded from Николай Тузов
#game4devs #concurrency
Если вы плохо понимаете проблемы параллельного программирования и конкурентного доступа, очень советую пройти игру - The Deadlock Empire.
Прохождение довольно интересное, быстро затягивает. Те кто осилит, на выходе будут хорошо понимать, почему и как параллельные процессы могут приводить к поломкам, как с этим бороться с помощью примитивов синхронизации и т.п.
Самое главное - вы поймёте, что безопасный параллельный код писать очень сложно, а порой даже невозможно (всегда будет оставаться маленькая вероятность фэйла, с которой придётся жить).
https://deadlockempire.github.io/
Если вы плохо понимаете проблемы параллельного программирования и конкурентного доступа, очень советую пройти игру - The Deadlock Empire.
Прохождение довольно интересное, быстро затягивает. Те кто осилит, на выходе будут хорошо понимать, почему и как параллельные процессы могут приводить к поломкам, как с этим бороться с помощью примитивов синхронизации и т.п.
Самое главное - вы поймёте, что безопасный параллельный код писать очень сложно, а порой даже невозможно (всегда будет оставаться маленькая вероятность фэйла, с которой придётся жить).
https://deadlockempire.github.io/
deadlockempire.github.io
The Deadlock Empire
Slay dragons, learn
concurrency! Play the cunning Scheduler, exploit flawed
programs and defeat the armies of the Parallel Wizard.
concurrency! Play the cunning Scheduler, exploit flawed
programs and defeat the armies of the Parallel Wizard.
Forwarded from Николай Тузов
#game4devs #sql #database
Игра для практики написания SQL-запросов
Ещё одна игра для разработчиков - SQL Murder Mystery. В этот раз нам предлагают раскрывать преступления путём исследования данных в предоставленной БД. Шикарная идея и крутая реализация.
К примеру, если у вас есть проблемы с SQL на собеседованиях, а на текущей работе такой практики не хватает, то игра создана для вас.
Сложно заставить себя изучать SQL на скучных искусственных примерах из учебников. Плюс этот навык довольно быстро выветривается, когда нет практики.
Но когда появляется интересная цель, процесс идёт намного бодрее. К тому же так лучше усваивается и запоминается.
Кстати, по поводу реализации. Мне не очень понравилось писать запросы в маленьком окошке. К счастью, исходники есть на GitHub. Отсюда можно скачать базу данных игры (файл sql-murder-mystery.db) и исследовать её локально в любом удобном клиенте - это SQLite.
Игра для практики написания SQL-запросов
Ещё одна игра для разработчиков - SQL Murder Mystery. В этот раз нам предлагают раскрывать преступления путём исследования данных в предоставленной БД. Шикарная идея и крутая реализация.
К примеру, если у вас есть проблемы с SQL на собеседованиях, а на текущей работе такой практики не хватает, то игра создана для вас.
Сложно заставить себя изучать SQL на скучных искусственных примерах из учебников. Плюс этот навык довольно быстро выветривается, когда нет практики.
Но когда появляется интересная цель, процесс идёт намного бодрее. К тому же так лучше усваивается и запоминается.
Кстати, по поводу реализации. Мне не очень понравилось писать запросы в маленьком окошке. К счастью, исходники есть на GitHub. Отсюда можно скачать базу данных игры (файл sql-murder-mystery.db) и исследовать её локально в любом удобном клиенте - это SQLite.
Knight Lab's SQL Murder Mystery
Use SQL queries to solve the murder mystery. Suitable for beginners or experienced SQL sleuths.
Первый коммит в git-репозиторий Go был сделан в 1972 году Брайаном Керниганом
Первый коммит и правда датируется 1972 годом:
Следующие два в 1988: первый конвертируют код в ANSI C, во втором приезжает мелкий фикс к первому.
После этого Роберт Грейсмер начинает работать над спецификацией Go в 2008.
По этой ссылке можно посмотреть на историю этих коммитов визуально.
Забавно, что сам git официально появился лишь в 2005 году.
Как это возможно? В git вы можете устанавливать дату своего коммита как угодно. Возможно, Брайан (или кто-то другой) таким образом хотел подчеркнуть тот факт, что идеи языка Go зародились в 1972 году. Для сравнения, язык C разрабатывался в 1969—1973 годах.
Источник
Первый коммит и правда датируется 1972 годом:
main( ) {Следующим идет коммит 1974 года, конвертирующий предыдущий в язык C.
extrn a, b, c;
putchar(a); putchar(b); putchar(c); putchar('!*n');
}
a 'hell';
b 'o, w';
c 'orld';
Следующие два в 1988: первый конвертируют код в ANSI C, во втором приезжает мелкий фикс к первому.
После этого Роберт Грейсмер начинает работать над спецификацией Go в 2008.
По этой ссылке можно посмотреть на историю этих коммитов визуально.
Забавно, что сам git официально появился лишь в 2005 году.
Как это возможно? В git вы можете устанавливать дату своего коммита как угодно. Возможно, Брайан (или кто-то другой) таким образом хотел подчеркнуть тот факт, что идеи языка Go зародились в 1972 году. Для сравнения, язык C разрабатывался в 1969—1973 годах.
Источник
Подробный разбор типа Map в Go
Что разбирается в видео:
- Структуры, реализующие Map и их исходный код: заголовок мапы (hmap), структура бакетов, type descriptor и др.
- Операция поиска значения и её исходный код
- Процессы, происходящие в Map: рост мапы, эвакуация данных, переполнение бакета
- Во что преобразуются базовые операции над мапой и как они обходятся без дженериков?
Как результат, мы получаем ответы на важные вопросы:
- Зачем и как заранее аллоцировать под мапу память?
- Почему нельзя взять указатель на элемент мапы?
- Почему порядок обхода мапы случайный?
- Почему при этом вывод fmt.Println(map) фиксированный?
- Как растёт мапа при заполнении?
#video #map #детали_реализации #тонкости_go
https://youtu.be/P_SXTUiA-9Y
Что разбирается в видео:
- Структуры, реализующие Map и их исходный код: заголовок мапы (hmap), структура бакетов, type descriptor и др.
- Операция поиска значения и её исходный код
- Процессы, происходящие в Map: рост мапы, эвакуация данных, переполнение бакета
- Во что преобразуются базовые операции над мапой и как они обходятся без дженериков?
Как результат, мы получаем ответы на важные вопросы:
- Зачем и как заранее аллоцировать под мапу память?
- Почему нельзя взять указатель на элемент мапы?
- Почему порядок обхода мапы случайный?
- Почему при этом вывод fmt.Println(map) фиксированный?
- Как растёт мапа при заполнении?
#video #map #детали_реализации #тонкости_go
https://youtu.be/P_SXTUiA-9Y
YouTube
Как на самом деле устроен тип Map в Golang? | Golang под капотом
В этом видео мы в деталях разберемся, как устроен тип Map в Go и сможем ответить на некоторые очень интересные вопросы:
- зачем заранее аллоцировать память под мапы?
- почему порядок их обхода случайный?
- почему нельзя взять ссылку на элемент мапы?…
- зачем заранее аллоцировать память под мапы?
- почему порядок их обхода случайный?
- почему нельзя взять ссылку на элемент мапы?…
История создания Гофера - маскота Golang 💙
На мой взгляд, это самый удачный и популярный маскот IT-технологии.
Интересно, что впервые Гофер был нарисован задолго до создания самого Go.
https://go.dev/blog/gopher
#gopher #mascot #history
На мой взгляд, это самый удачный и популярный маскот IT-технологии.
Интересно, что впервые Гофер был нарисован задолго до создания самого Go.
https://go.dev/blog/gopher
#gopher #mascot #history
Разбор интересных нововведений в Go 1.19
Автор не просто выделил интересные моменты, но и попытался подробно их разжевать, объясняя основную суть и мотивацию авторов.
О чем пойдет речь:
- Область действия типов в объявлениях методов
- Модель памяти
- Новые типы в пакете sync/atomic
- Soft Memory Limit
- Оптимизация
- Прочие минорные изменения
В целом версия 1.19 не внесла каких-то больших и значимых изменений в Go по сравнению с 1.18. В статье опущена часть минорных трансформаций. С их полным списком можно ознакомиться на странице релиза 1.19. Так как официальный релиз намечен на август, можно предположить, что ещё какие-то изменения обязательно появятся.
https://habr.com/ru/company/ozontech/blog/674190/
Автор не просто выделил интересные моменты, но и попытался подробно их разжевать, объясняя основную суть и мотивацию авторов.
О чем пойдет речь:
- Область действия типов в объявлениях методов
- Модель памяти
- Новые типы в пакете sync/atomic
- Soft Memory Limit
- Оптимизация
- Прочие минорные изменения
В целом версия 1.19 не внесла каких-то больших и значимых изменений в Go по сравнению с 1.18. В статье опущена часть минорных трансформаций. С их полным списком можно ознакомиться на странице релиза 1.19. Так как официальный релиз намечен на август, можно предположить, что ещё какие-то изменения обязательно появятся.
https://habr.com/ru/company/ozontech/blog/674190/
tip.golang.org
Go 1.19 Release Notes - The Go Programming Language
go-git - реализация Git на Go
Это не просто клиент, а полноценная реализация на чистом Go.
Она создана для удобной интеграции Git в сервисы, написанные на Go.
go-git ориентирован на расширяемость, совместимость и поддерживает большинство подключаемых API, которые описаны здесь.
Пример использования:
Это не просто клиент, а полноценная реализация на чистом Go.
Она создана для удобной интеграции Git в сервисы, написанные на Go.
go-git ориентирован на расширяемость, совместимость и поддерживает большинство подключаемых API, которые описаны здесь.
Пример использования:
_, err := git.PlainClone("/tmp/foo", false, &git.CloneOptions{В результате, мы получаем экземпляр Repository и можем делать с ним всякое:
URL: "https://github.com/go-git/go-git",
Progress: os.Stdout,
})
————
Counting objects: 4924, done.
Compressing objects: 100% (1333/1333), done.
Total 4924 (delta 530), reused 6 (delta 6), pack-reused 3533
// получаем ветку по указателю HEADЧуть больше информации см. здесь.
ref, err := r.Head()
// получаем объект коммита по указателю ref
commit, err := r.CommitObject(ref.Hash())
// получаем историю коммита
history, err := commit.History()
// проходим по коммитам и выводим каждый из них
for _, c := range history {
fmt.Println(c)
}
GitHub
GitHub - go-git/go-git: A highly extensible Git implementation in pure Go.
A highly extensible Git implementation in pure Go. - go-git/go-git
GoGetPodcast #3: GameDev в Go
http://tuzov.link/gogetpodcast3
Обсудили вопросы, связанные с геймдевом на Go: подходит ли Go для геймдева? Какие основные плюсы и минусы? На какие игровые движки стоит обратить внимание? И др.
В гостях были Искандер Шарипов и Алексей Акулович, которые увлекаются разработкой игр на Go в качестве хобби.
Глеб Яльчик, постоянный участник подкаста, работает в геймдеве, и имеет в этой области огромный опыт.
#gogetpodcast
http://tuzov.link/gogetpodcast3
Обсудили вопросы, связанные с геймдевом на Go: подходит ли Go для геймдева? Какие основные плюсы и минусы? На какие игровые движки стоит обратить внимание? И др.
В гостях были Искандер Шарипов и Алексей Акулович, которые увлекаются разработкой игр на Go в качестве хобби.
Глеб Яльчик, постоянный участник подкаста, работает в геймдеве, и имеет в этой области огромный опыт.
#gogetpodcast
Небольшая статья про кодогенерацию в Go
https://habr.com/ru/company/sbermarket/blog/676486/
Представляет из себя подборку популярных инструментов и подходов для кодогенерации с кратким пояснением происходящего.
Для новичков будет отличной отправной точкой для знакомства с кодогенерацией. Опытным же разработчикам может помочь закрыть пробелы в конкретных областях.
Список инструментов:
- Для создания проекта: buffalo, beego.
- Для создания веб-сервера и клиента по спецификации: swag, go-swagger, oapi-codegen, openapi-generator.
- Для генерации метрик: gowrap.
- Для создания моков: mockery, gomock.
- Для инициализации графа зависимостей: wire.
- Для запуска генераторов одной строкой: go generate.
#article #code_generation #compilation
https://habr.com/ru/company/sbermarket/blog/676486/
Представляет из себя подборку популярных инструментов и подходов для кодогенерации с кратким пояснением происходящего.
Для новичков будет отличной отправной точкой для знакомства с кодогенерацией. Опытным же разработчикам может помочь закрыть пробелы в конкретных областях.
Список инструментов:
- Для создания проекта: buffalo, beego.
- Для создания веб-сервера и клиента по спецификации: swag, go-swagger, oapi-codegen, openapi-generator.
- Для генерации метрик: gowrap.
- Для создания моков: mockery, gomock.
- Для инициализации графа зависимостей: wire.
- Для запуска генераторов одной строкой: go generate.
#article #code_generation #compilation
Хабр
Как Go-разработчику сэкономить несколько недель жизни
Привет! Меня зовут Александр Сусиков, я тимлид команды, которая занимается платформой PaaS для СберМаркета. В этой статье я расскажу, как повысить скорость разработки с помощью кодогенерации. Зачем...
Почему важно хорошо оформлять Pull Request'ы и коммиты
Многие недооценивают важность правильного оформления PRов и коммитов.
В статье подробно и на конкретным примере рассказывается, почему этому стоит уделять особое внимание.
#статья #разработка
Многие недооценивают важность правильного оформления PRов и коммитов.
В статье подробно и на конкретным примере рассказывается, почему этому стоит уделять особое внимание.
#статья #разработка
tuzov.su
Почему важно хорошо оформлять Pull Request'ы и коммиты | Николай Тузов
Блог о разработке и технологиях
Видео про внутреннее устройство каналов в Go
В видео разобрано:
- как как реализована потокобезопасноть каналов
- как в буферизированном канале хранятся данные
- какие интересные оптимизации там есть
- как работает оператор Select
- как каналы закрываются и др.
Теория чередуется с разбором исходного кода каналов. Также присутствует препарирование каналов через в дебагере.
https://www.youtube.com/watch?v=ZTJcaP4G4JM
#видео #детали_реализации #channels
В видео разобрано:
- как как реализована потокобезопасноть каналов
- как в буферизированном канале хранятся данные
- какие интересные оптимизации там есть
- как работает оператор Select
- как каналы закрываются и др.
Теория чередуется с разбором исходного кода каналов. Также присутствует препарирование каналов через в дебагере.
https://www.youtube.com/watch?v=ZTJcaP4G4JM
#видео #детали_реализации #channels
YouTube
Как на самом деле устроены каналы в Golang? | Golang channels internals
Разбираемся со внутренним устройством каналов: как реализована потокобезопасноть, как в буферизированном канале хранятся данные, какие интересные оптимизации там есть, как работает оператор Select, как каналы закрываются и др.
----
❤️ Если у вас есть желание…
----
❤️ Если у вас есть желание…
GoGetPodcast #4: собеседование Go-разработчика глазами нанимателя
Обсудили вопросы, которые не дают покоя многим разработчикам:
- Берут ли на работу новичков?
- Зачем на собеседованиях нужны алгоритмы и live-coding?
- Достаточно ли скинуть ссылку на pet-project на GitHub'е?
- Играет ли роль высшее образование?
- Играет ли роль возраст?
и др.
Выпуск доступен на всех площадках, ссылки тут.
#gogetpodcast #podcast
Обсудили вопросы, которые не дают покоя многим разработчикам:
- Берут ли на работу новичков?
- Зачем на собеседованиях нужны алгоритмы и live-coding?
- Достаточно ли скинуть ссылку на pet-project на GitHub'е?
- Играет ли роль высшее образование?
- Играет ли роль возраст?
и др.
Выпуск доступен на всех площадках, ссылки тут.
#gogetpodcast #podcast
gogetpodcast.ru
Выпуск #4: Собеседование Go-разработчика глазами нанимателя | Go Get Podcast
Обсуждаем язык Go и всё, что с ним связано
Golang Дайджест
GoGetPodcast #4: собеседование Go-разработчика глазами нанимателя Обсудили вопросы, которые не дают покоя многим разработчикам: - Берут ли на работу новичков? - Зачем на собеседованиях нужны алгоритмы и live-coding? - Достаточно ли скинуть ссылку…
А теперь этот выпуск можно посмотреть и на YouTube, посмотреть на лица участников 😊
https://youtu.be/SPj-Kg2fTCk
https://youtu.be/SPj-Kg2fTCk
YouTube
Собеседование Go-разработчика глазами нанимателя | GoGetPodcast №4
Обсудили вопросы, которые не дают покоя многим разработчикам:
- Берут ли на работу новичков?
- Зачем на собеседованиях нужны алгоритмы и live-coding?
- Достаточно ли скинуть ссылку на pet-project на GitHub'е?
- Играет ли роль высшее образование?…
- Берут ли на работу новичков?
- Зачем на собеседованиях нужны алгоритмы и live-coding?
- Достаточно ли скинуть ссылку на pet-project на GitHub'е?
- Играет ли роль высшее образование?…
Learn X in Y minutes, where X=Go
https://learnxinyminutes.com/docs/go/
Ещё один интересный способ быстро познакомиться с Go. Подходит для людей, которые уже умеют программировать на другом языке. Но это даже быстрее, чем Tour of Go!
Мои комментарии тут излишни, просто взгляните своими глазами.
Есть русскоязычный вариант, но он выглядит чуть менее актуальным.
Кроме Go, на сайте разобрано множество других языков. Например, JSON и Си.
#study #article
https://learnxinyminutes.com/docs/go/
Ещё один интересный способ быстро познакомиться с Go. Подходит для людей, которые уже умеют программировать на другом языке. Но это даже быстрее, чем Tour of Go!
Мои комментарии тут излишни, просто взгляните своими глазами.
Есть русскоязычный вариант, но он выглядит чуть менее актуальным.
Кроме Go, на сайте разобрано множество других языков. Например, JSON и Си.
#study #article
Как устроена функция time.Sleep() в Go?
Каждый из вас наверняка пользовался этой функцией, заставляющей горутину немного подождать. Но заглядывали ли вы ей под капот?
В этой статье предлагается туда заглянуть.
#article #internals
Каждый из вас наверняка пользовался этой функцией, заставляющей горутину немного подождать. Но заглядывали ли вы ей под капот?
В этой статье предлагается туда заглянуть.
#article #internals
Николай Тузов - блог
Как устроена функция time.Sleep() в Golang
Вам наверняка не раз доводилось писать такой код:
func main() {
// ...
time.Sleep(4 * time.Second)
// ...
}
Он заставляет программу (горутину) подождать указанное количество секунд. Но что происходит внутри функции time.Sleep()? Давайте разберемся.
func main() {
// ...
time.Sleep(4 * time.Second)
// ...
}
Он заставляет программу (горутину) подождать указанное количество секунд. Но что происходит внутри функции time.Sleep()? Давайте разберемся.
Официальный гайд по GoDoc-комментам
Мало кто знает, но такой гайд существует. Если хочешь стать godoc-мастером, очень рекомендую. Коллеги будут очень благодарны.
Здесь подробно разобрано:
- что такое godoc
- в каких случаях стоит писать такие комменты (спойлер - every exported name should have a doc comment)
- как их правильно писать в разных случаях (для типов, функций, констант, переменных и т.п.)
- как всё это форматировать
Всё разобрано очень подробно, приводится множество примеров.
#article #godoc #codestyle
Мало кто знает, но такой гайд существует. Если хочешь стать godoc-мастером, очень рекомендую. Коллеги будут очень благодарны.
Здесь подробно разобрано:
- что такое godoc
- в каких случаях стоит писать такие комменты (спойлер - every exported name should have a doc comment)
- как их правильно писать в разных случаях (для типов, функций, констант, переменных и т.п.)
- как всё это форматировать
Всё разобрано очень подробно, приводится множество примеров.
#article #godoc #codestyle