Новое руководство по работе с пакетом
https://dev.to/karanpratapsingh/understand-context-in-go-46em
@Golang_google
context
https://dev.to/karanpratapsingh/understand-context-in-go-46em
@Golang_google
Forwarded from Go tests
Что будет результатом выполнения кода?
Anonymous Quiz
50%
не скомпилируется
34%
скомпилируется но запаникует в рантайме
16%
скомпилируется и успешно отработает
🌏Исправить код и спасти жизни, решив задачку от VK
Манекены совершили восстание! И все из-за ошибок в коде, который лежит в основе нашего мира. Их допустил Создатель. Но в ваших силах исправить их и предотвратить конец света. По ссылке ниже вас ждут три задачи на языках Python, Java, Go. Каждая из них разбита на блоки по грейдам: джун, мидл, синьор.
Решите тест, найдите все правильные варианты и спасите мир.
Код: https://vc.ru/special/godcode
@Golang_google
Манекены совершили восстание! И все из-за ошибок в коде, который лежит в основе нашего мира. Их допустил Создатель. Но в ваших силах исправить их и предотвратить конец света. По ссылке ниже вас ждут три задачи на языках Python, Java, Go. Каждая из них разбита на блоки по грейдам: джун, мидл, синьор.
Решите тест, найдите все правильные варианты и спасите мир.
Код: https://vc.ru/special/godcode
@Golang_google
vc.ru
Чиним матрицу
Задачки из Небесной канцелярии
go-arch-lint
Запуск: go install github.com/fe3dback/go-arch-lint@latest
Код: https://github.com/fe3dback/go-arch-lint
Archfile пример: https://github.com/fe3dback/go-arch-lint/blob/master/docs/syntax/README.md
@Golang_google
Линтер
, который позволяет проверить корректность архитектурных слоев проекта по декларативному конфигу. Работает с любыми схемами hexagonal/onion/ddd/mvc/etc..
Запуск: go install github.com/fe3dback/go-arch-lint@latest
Код: https://github.com/fe3dback/go-arch-lint
Archfile пример: https://github.com/fe3dback/go-arch-lint/blob/master/docs/syntax/README.md
@Golang_google
❤️ Новый Golang-квиз от Evrone - это возможность испытать себя, проверить свои знания и, возможно, даже выиграть главный приз!
Сеньоры Evrone подготовили 8 нестандартных вопросов - уровнем от easy до hard, чтобы ты на практике продемонстрировал всем, кто здесь самый крутой гофер. В финал выйдут самые знающие - допустившее не более одной ошибки в ответах.
🎁 Среди этих героев 25-го августа мы разыграем Яндекс.Станцию при помощи генератора случайных чисел.
Торопись стать победителем по ссылке!
Сеньоры Evrone подготовили 8 нестандартных вопросов - уровнем от easy до hard, чтобы ты на практике продемонстрировал всем, кто здесь самый крутой гофер. В финал выйдут самые знающие - допустившее не более одной ошибки в ответах.
🎁 Среди этих героев 25-го августа мы разыграем Яндекс.Станцию при помощи генератора случайных чисел.
Торопись стать победителем по ссылке!
Замена нескольких строк в Golang с помощью Replacer
https://dev-gang.ru/article/zamena-neskolkih-strok-v-golang-s-pomosczu-replacer-hsx350aece/
@Golang_google
https://dev-gang.ru/article/zamena-neskolkih-strok-v-golang-s-pomosczu-replacer-hsx350aece/
@Golang_google
sachaos/viddy: 👀 A modern watch command. Time machine and
https://github.com/sachaos/viddy
@Golang_google
https://github.com/sachaos/viddy
@Golang_google
Где разместить логгер в Golang?
Ведение журнала является неотъемлемой частью любого приложения. Однако правильное расположение и использование логгера в структуре проекта вызывает вопросы даже у опытных разработчиков.
Есть несколько способов сделать это, из которых я отдаю предпочтение одному. Я объясню почему.
При разработке приложения разработчик выбирает один из нескольких явных вариантов:
сохранить регистратор в глобальной переменной;
получить логгер из библиотеки логирования;
добавить логгер в структуры данных;
явно передать регистратор в вызове функции.
В этой статье я буду использовать регистратор Zap в качестве примера, но вы можете использовать любой.
Читать дальше
@Golang_google
Ведение журнала является неотъемлемой частью любого приложения. Однако правильное расположение и использование логгера в структуре проекта вызывает вопросы даже у опытных разработчиков.
Есть несколько способов сделать это, из которых я отдаю предпочтение одному. Я объясню почему.
При разработке приложения разработчик выбирает один из нескольких явных вариантов:
сохранить регистратор в глобальной переменной;
получить логгер из библиотеки логирования;
добавить логгер в структуры данных;
явно передать регистратор в вызове функции.
В этой статье я буду использовать регистратор Zap в качестве примера, но вы можете использовать любой.
Читать дальше
@Golang_google
Пишем REST API с использованием Gin + GORM.
https://carlosmv.hashnode.dev/building-a-rest-api-with-go-gin-framework-and-gorm
@Golang_google
https://carlosmv.hashnode.dev/building-a-rest-api-with-go-gin-framework-and-gorm
@Golang_google
Архиватор на Go: серия видеоуроков по Go от Николая Тузова
— Вводная часть, Variable-Length Code
— Каркас программы
— Алгоритм сжатия
— Распаковка сжатых файлов
— Работа над ошибками
— Рефакторинг
— Алгоритм Шеннона-Фано - теория
— Алгоритм Шеннона-Фано - реализация
Смотреть
— Вводная часть, Variable-Length Code
— Каркас программы
— Алгоритм сжатия
— Распаковка сжатых файлов
— Работа над ошибками
— Рефакторинг
— Алгоритм Шеннона-Фано - теория
— Алгоритм Шеннона-Фано - реализация
Смотреть
YouTube
Пишем свой архиватор на Go
Share your videos with friends, family, and the world
Что читать Golang-разработчику. Семь главных книг: от Донована и Кернигана до МакДауэлл
Спрос на бэкенд-разработчиков — а Go неотделим от бэкенд-программирования — стабильно растет. У самого же Golang немало плюсов: простой, строгий, статически типизированный, он обладает развитой стандартной библиотекой и славится поддержкой параллельного и асинхронного программирования. При этом в Golang нет классов и нет поддержки наследования, что значительно повышает удобство поддержки кода. Благодаря этим и другим преимуществам Go в последние годы сохраняет статус популярного и перспективного языка.
В МойОфис мы широко используем Go в качестве основного языка для разработки корпоративной почты нового поколения Mailion. При этом разрабатываем на нём не только микросервисы, но и собственное хранилище с поддержкой дедупликации (про устройство Mailion читайте здесь). В связи с этим мы постоянно следим за книжными новинками и актуальными темами современной бэкенд-разработки. Специальной литературы по теме Golang существует немало, однако с помощью наших разработчиков мы выбрали самые важные, профессионально полезные и увлекательно написанные издания.
Делимся рекомендациями книг под катом!
Читать дальше
@golang_books - библиотека Go разработчика
@Golang_google
Спрос на бэкенд-разработчиков — а Go неотделим от бэкенд-программирования — стабильно растет. У самого же Golang немало плюсов: простой, строгий, статически типизированный, он обладает развитой стандартной библиотекой и славится поддержкой параллельного и асинхронного программирования. При этом в Golang нет классов и нет поддержки наследования, что значительно повышает удобство поддержки кода. Благодаря этим и другим преимуществам Go в последние годы сохраняет статус популярного и перспективного языка.
В МойОфис мы широко используем Go в качестве основного языка для разработки корпоративной почты нового поколения Mailion. При этом разрабатываем на нём не только микросервисы, но и собственное хранилище с поддержкой дедупликации (про устройство Mailion читайте здесь). В связи с этим мы постоянно следим за книжными новинками и актуальными темами современной бэкенд-разработки. Специальной литературы по теме Golang существует немало, однако с помощью наших разработчиков мы выбрали самые важные, профессионально полезные и увлекательно написанные издания.
Делимся рекомендациями книг под катом!
Читать дальше
@golang_books - библиотека Go разработчика
@Golang_google
GitHub - quii/learn-go-with-tests: Learn Go with test-driven development
https://github.com/quii/learn-go-with-tests
@Golang_google
https://github.com/quii/learn-go-with-tests
@Golang_google
✏️ Потоковая обработка на go1.18
В версии 1.18 языка Go появились генерики, дающие возможность писать обобщенный код, то есть код, не зависящий от конкретного типа данных. Например можно написать код, обрабатывающий потоки данных - применить к ним одну и ту же функцию, отфильтровать, просуммировать и т.д., не завязываясь на конкретные типы данных. Так как я вижу потенциал в парадигме поточной обработки с помощью итераторов/стримов и теперь есть возможность реализовать ее в Go, я решил сделать это.
Эта идея появилась у меня после данной публикации. В ней рассказывается о библиотеке для языка Go для обработки данных с использованием генериков. Я попробовал эту библиотеку в своем проекте и столкнулся с следующими недостатками:
настойчивое использование IO[A], который по сути представляет собой func()(A,error) то есть любую функцию, которая может вернуть ошибку. При написании кода это создает неудобства, потому что нужно всё заворачивать в этот IO и код превращается в жонглирование io.Map и io.FlatMap. Видимо это вдохновлено библиотеками с чисто функциональным подходом. Сделано это было, чтобы была функциональная чистота, что в итоге не очень (как по мне) ложится на процедурность языка Go.
Stream[A] это обертка над стейт-машиной. Стейт-машина в данном случае это структура, в которой либо ничего нет (конец потока), либо значение и продолжение (следующее состояние) машины. В итоге это создает две проблемы. Первая: чтобы создать стрим, нужно создать его продолжение, продолжение продолжения и тд. Единственный адекватный способ этим пользоваться, который я нашел - это рекурсия. Вкупе с отсутствием Tail call optimization это приводит к второй проблеме.
Работа с стримами переполняет стек. Модель потока как стейт-машины была построена так, что переход к новому состоянию - вызов функции. Поэтому, чтобы обойти стрим целиком, надо уйти в рекурсию на глубину, равную длине потока.
Построение типа Either[A,B]. По моему скромному мнению, это вообще тип, которого не хватает в Go и который разумно реализован в языке Rust. В библиотеке этот тип это структура, содержащая и элемент типа A и элемент типа B . Плюс булевое поле как способ идентификации какой из полей действителен на самом деле. Важно то, что по сути тип Either[A,B], семантика которого элемент типа A ИЛИ B, представляется в языке как пара из элемента типа A И элемента типа B.
Не совсем очевидный интерфейс. Хотя это скорее я не до конца разобрался, что и почему. Так или иначе, я считаю, что построил интерфейс более простой и прямолинейный, не потеряв в общности.
Читать дальше
@Golang_google
В версии 1.18 языка Go появились генерики, дающие возможность писать обобщенный код, то есть код, не зависящий от конкретного типа данных. Например можно написать код, обрабатывающий потоки данных - применить к ним одну и ту же функцию, отфильтровать, просуммировать и т.д., не завязываясь на конкретные типы данных. Так как я вижу потенциал в парадигме поточной обработки с помощью итераторов/стримов и теперь есть возможность реализовать ее в Go, я решил сделать это.
Эта идея появилась у меня после данной публикации. В ней рассказывается о библиотеке для языка Go для обработки данных с использованием генериков. Я попробовал эту библиотеку в своем проекте и столкнулся с следующими недостатками:
настойчивое использование IO[A], который по сути представляет собой func()(A,error) то есть любую функцию, которая может вернуть ошибку. При написании кода это создает неудобства, потому что нужно всё заворачивать в этот IO и код превращается в жонглирование io.Map и io.FlatMap. Видимо это вдохновлено библиотеками с чисто функциональным подходом. Сделано это было, чтобы была функциональная чистота, что в итоге не очень (как по мне) ложится на процедурность языка Go.
Stream[A] это обертка над стейт-машиной. Стейт-машина в данном случае это структура, в которой либо ничего нет (конец потока), либо значение и продолжение (следующее состояние) машины. В итоге это создает две проблемы. Первая: чтобы создать стрим, нужно создать его продолжение, продолжение продолжения и тд. Единственный адекватный способ этим пользоваться, который я нашел - это рекурсия. Вкупе с отсутствием Tail call optimization это приводит к второй проблеме.
Работа с стримами переполняет стек. Модель потока как стейт-машины была построена так, что переход к новому состоянию - вызов функции. Поэтому, чтобы обойти стрим целиком, надо уйти в рекурсию на глубину, равную длине потока.
Построение типа Either[A,B]. По моему скромному мнению, это вообще тип, которого не хватает в Go и который разумно реализован в языке Rust. В библиотеке этот тип это структура, содержащая и элемент типа A и элемент типа B . Плюс булевое поле как способ идентификации какой из полей действителен на самом деле. Важно то, что по сути тип Either[A,B], семантика которого элемент типа A ИЛИ B, представляется в языке как пара из элемента типа A И элемента типа B.
Не совсем очевидный интерфейс. Хотя это скорее я не до конца разобрался, что и почему. Так или иначе, я считаю, что построил интерфейс более простой и прямолинейный, не потеряв в общности.
Читать дальше
@Golang_google