Golang-дайджест № 20 (1 – 31 августа 2022)
Свежая подборка новостей и материалов
Выпущена версия 1.19 — что нового:
- Сборщику мусора теперь можно задать ограничение памяти. Подробнее здесь.
- Модель памяти теперь явно определяет поведение sync/atomic пакета.
- Пакет os/exec больше не учитывает относительные пути при PATH поиске.
- Комментарии к документам теперь поддерживают ссылки, списки и заголовки с префиксом.
- Исправления проблем, связанных с дженериками.
- discussion: Добавление стандартного интерфейса итератора в Go?
- GoLand Roadmap 2022.3
- Выпущен GoLand 2022.2
Alcione Ribeiro опубликовала в github схему вязания крючком, чтобы связать своего собственного персонажа Go gopher!
Awesome:
- https://awesome-go.com/
- https://github.com/guardrailsio/awesome-golang-security
- https://github.com/Binject/awesome-go-security
- https://gist.github.com/hbt/d6ab942b882d5b94f331c5257076d05e
- https://github.com/avelino/awesome-go
@Golang_google
Свежая подборка новостей и материалов
Выпущена версия 1.19 — что нового:
- Сборщику мусора теперь можно задать ограничение памяти. Подробнее здесь.
- Модель памяти теперь явно определяет поведение sync/atomic пакета.
- Пакет os/exec больше не учитывает относительные пути при PATH поиске.
- Комментарии к документам теперь поддерживают ссылки, списки и заголовки с префиксом.
- Исправления проблем, связанных с дженериками.
- discussion: Добавление стандартного интерфейса итератора в Go?
- GoLand Roadmap 2022.3
- Выпущен GoLand 2022.2
Alcione Ribeiro опубликовала в github схему вязания крючком, чтобы связать своего собственного персонажа Go gopher!
Awesome:
- https://awesome-go.com/
- https://github.com/guardrailsio/awesome-golang-security
- https://github.com/Binject/awesome-go-security
- https://gist.github.com/hbt/d6ab942b882d5b94f331c5257076d05e
- https://github.com/avelino/awesome-go
@Golang_google
pgweb – web-клиент для СУБД PostgreSQL реализованный на Go
Работает на всех актуальных платформах. Из преимуществ: простая установка, импорт/експорт данных
⤷ Ссылка на проект
@Golang_google | #Interesting #Database #Go
Работает на всех актуальных платформах. Из преимуществ: простая установка, импорт/експорт данных
⤷ Ссылка на проект
@Golang_google | #Interesting #Database #Go
➡️ Как Go выполняет встраивание
В статье рассказано, как Go подходит к инлайнингу функций — этот процесс ещё называют встраиванием. В статье разберёмся, зачем вообще это нужно, какой профит можно получить для ускорения работы кода, а когда плюсы могут обернуться минусами. На примерах углубимся в специфику Go: как этот язык инлайнит функции, что можно и что нельзя встроить, какие возможности доступны в разных версиях. Также обсудим ограничения и способы обойти их.
➡️ Читать дальше
🎞 Видео
@Golang_google
В статье рассказано, как Go подходит к инлайнингу функций — этот процесс ещё называют встраиванием. В статье разберёмся, зачем вообще это нужно, какой профит можно получить для ускорения работы кода, а когда плюсы могут обернуться минусами. На примерах углубимся в специфику Go: как этот язык инлайнит функции, что можно и что нельзя встроить, какие возможности доступны в разных версиях. Также обсудим ограничения и способы обойти их.
➡️ Читать дальше
🎞 Видео
@Golang_google
🛠 Инструменты для управления уязвимостями в Go-проекте на текущий момент.
➡️ Читать
⚙️ Vulnerability database
@Golang_google
➡️ Читать
⚙️ Vulnerability database
@Golang_google
🦾 restic
это быстрая, эффективная и безопасная программа резервного копирования на GO. Инструмент поддерживает три основные операционные системы (Linux, macOS, Windows) и несколько более мелких (FreeBSD, OpenBSD).
⚙️ Github
🗒 Docs
@Golang_google
это быстрая, эффективная и безопасная программа резервного копирования на GO. Инструмент поддерживает три основные операционные системы (Linux, macOS, Windows) и несколько более мелких (FreeBSD, OpenBSD).
⚙️ Github
🗒 Docs
@Golang_google
🈯 Регулярные выражения в Go
https://medium.com/@hrosch/regular-expressions-in-go-c90ebedf58d6
@Golang_google
https://medium.com/@hrosch/regular-expressions-in-go-c90ebedf58d6
@Golang_google
↪️ Мой аналог The GO Playground
Под данным катом описано как я создал свой аналог The GO Playground. Это было сделано исключительно по собственному желанию в образовательных целях. Ссылка на репозиторий.
Кодовая база проекта традиционно состоит из фронта и бэка. В качестве языка бэка используется Go, на фронте JS + jQuery.
В моей реализации реактивная отправка данных на фронт осуществляется с помощью протокола WS, а получение исходного кода по ссылке с помощью HTTP. Для роутинга в приложении я использовал httprouter. Изначально я использовал html/template и автообновление блоков HTML c помощью функции load(), но потом отошел от этой идеи ввиду некоторых сложностей реализации.
На самом деле оригинальная платформа сделана очень хитрым образом с точки зрения использования ресурсов системы. Если в пользовательской программе используются конструкции задержки по типу time.Sleep, программа на самом деле не спит, а выполняет свой код непрерывно, минуя задержки. А на выходе генерируется последовательность байт с учетом задержки, которую фронт отрабатывает таким образом, что пользователь не видит разницы. Создается ощущение, что программа запущена локально. Для безопасной работы с сетью и файловой системой используются некоторые трюки, про все подробности, используемые в The GO Playground можно почитать по ссылке. Оригинальный код платформы по ссылке.
Домашняя страница выглядит весьма минималистично, на выбор представлено пару тестовых программ. Блок ввода кода, блок результата выполнения программы.
➡️ Читать
⚙️ Github
@Golang_google
Под данным катом описано как я создал свой аналог The GO Playground. Это было сделано исключительно по собственному желанию в образовательных целях. Ссылка на репозиторий.
Кодовая база проекта традиционно состоит из фронта и бэка. В качестве языка бэка используется Go, на фронте JS + jQuery.
В моей реализации реактивная отправка данных на фронт осуществляется с помощью протокола WS, а получение исходного кода по ссылке с помощью HTTP. Для роутинга в приложении я использовал httprouter. Изначально я использовал html/template и автообновление блоков HTML c помощью функции load(), но потом отошел от этой идеи ввиду некоторых сложностей реализации.
На самом деле оригинальная платформа сделана очень хитрым образом с точки зрения использования ресурсов системы. Если в пользовательской программе используются конструкции задержки по типу time.Sleep, программа на самом деле не спит, а выполняет свой код непрерывно, минуя задержки. А на выходе генерируется последовательность байт с учетом задержки, которую фронт отрабатывает таким образом, что пользователь не видит разницы. Создается ощущение, что программа запущена локально. Для безопасной работы с сетью и файловой системой используются некоторые трюки, про все подробности, используемые в The GO Playground можно почитать по ссылке. Оригинальный код платформы по ссылке.
Домашняя страница выглядит весьма минималистично, на выбор представлено пару тестовых программ. Блок ввода кода, блок результата выполнения программы.
➡️ Читать
⚙️ Github
@Golang_google
🔥 Полезная подборка каналов
🦫 Golang
@golang_interview - вопросы и ответы с собеседований по Go. Для всех уровней разработчиков.
@Golang_google - go для разработчиков
@golangtests - тесты и задачи GO
@golangl - чат Golang
@GolangJobsit - вакансии и работа GO
@golang_jobsgo - чат вакансий
@golang_books - книги Golang
@golang_speak - обсуждение задач Go
🦾 Machine learning
@ai_machinelearning_big_data – все о машинном обучении
@data_analysis_ml – все о анализе данных.
@machinelearning_ru – машинное обучении на русском от новичка до профессионала.
@machinelearning_interview – подготовка к собеседования Data Science
@datascienceiot – бесплатные книги Machine learning
@ArtificialIntelligencedl – канал о искусственном интеллекте
@neural – все о нейронных сетях
@machinee_learning – чат о машинном обучении
@datascienceml_jobs - работа ds, ml
🐍 Python
@pythonl – python для датасаентиста
@pro_python_code – python на русском
@python_job_interview – подготовка к Python собеседованию
@python_testit тесты на python
@pythonlbooks - книги Python
@Django_pythonl django
@python_djangojobs - работа Python
🐧 Linux
@inux_kal - чат kali linux
@inuxkalii - linux kali
@linux_read - книги linux
👷♂️ IT работа
@hr_itwork - ит-ваканнсии
🔋 SQL
@sqlhub - базы данных
@chat_sql - базы данных чат
🤡It memes
@memes_prog - ит-мемы
💡 Javascript / front
@javascriptv - javascript изучение
@about_javascript - javascript продвинутый
@JavaScript_testit -тесты JS
@htmlcssjavas - web
@hashdev - web разработка
⚙️ Rust
@rust_code - язык программирования rust
@rust_chats - чат rust
#️⃣ c# c++
@csharp_ci - c# c++кодинг
@csharp_cplus чат
☕️ Java
@javatg - Java для програмистов
@javachats Java чат
@java_library - книги Java
@android_its Android разработка
@java_quizes - тесты Java
@Java_workit - работа Java
@progersit - шпаргалки ит
🦫 Golang
@golang_interview - вопросы и ответы с собеседований по Go. Для всех уровней разработчиков.
@Golang_google - go для разработчиков
@golangtests - тесты и задачи GO
@golangl - чат Golang
@GolangJobsit - вакансии и работа GO
@golang_jobsgo - чат вакансий
@golang_books - книги Golang
@golang_speak - обсуждение задач Go
🦾 Machine learning
@ai_machinelearning_big_data – все о машинном обучении
@data_analysis_ml – все о анализе данных.
@machinelearning_ru – машинное обучении на русском от новичка до профессионала.
@machinelearning_interview – подготовка к собеседования Data Science
@datascienceiot – бесплатные книги Machine learning
@ArtificialIntelligencedl – канал о искусственном интеллекте
@neural – все о нейронных сетях
@machinee_learning – чат о машинном обучении
@datascienceml_jobs - работа ds, ml
🐍 Python
@pythonl – python для датасаентиста
@pro_python_code – python на русском
@python_job_interview – подготовка к Python собеседованию
@python_testit тесты на python
@pythonlbooks - книги Python
@Django_pythonl django
@python_djangojobs - работа Python
🐧 Linux
@inux_kal - чат kali linux
@inuxkalii - linux kali
@linux_read - книги linux
👷♂️ IT работа
@hr_itwork - ит-ваканнсии
🔋 SQL
@sqlhub - базы данных
@chat_sql - базы данных чат
🤡It memes
@memes_prog - ит-мемы
💡 Javascript / front
@javascriptv - javascript изучение
@about_javascript - javascript продвинутый
@JavaScript_testit -тесты JS
@htmlcssjavas - web
@hashdev - web разработка
⚙️ Rust
@rust_code - язык программирования rust
@rust_chats - чат rust
#️⃣ c# c++
@csharp_ci - c# c++кодинг
@csharp_cplus чат
☕️ Java
@javatg - Java для програмистов
@javachats Java чат
@java_library - книги Java
@android_its Android разработка
@java_quizes - тесты Java
@Java_workit - работа Java
@progersit - шпаргалки ит
🍸 Как построить масштабируемый API на Go с помощью Gin
Что такое Gin?
Gin — это самый популярный высокопроизводительный фреймворк для Go (Golang), с помощью которого можно создавать веб-приложения. Если вы знакомы с ExpressJS, то Gin очень на него похож, и работать вам с ним будет довольно удобно.
Что мы будем создавать?
Проект у нас будет стандартный. Мы создадим простой API для работы с книгами. Не волнуйтесь, хоть ваш проект и будет основан на масштабируемом подходе, сам API окажется довольно простым, и проблем с пониманием процесса не возникнет.
Что необходимо?
Вам потребуется базовое понимание Go. Лично я в качестве редактора кода использую Visual Studio Code, вы же вольны выбирать на свое усмотрение. Только имейте ввиду, что в статье вам встретится команда code . — это собственная команда VSCode, которая открывает в редакторе текущий каталог.
➡️ Читать
⚙️ Github
@Golang_google
Что такое Gin?
Gin — это самый популярный высокопроизводительный фреймворк для Go (Golang), с помощью которого можно создавать веб-приложения. Если вы знакомы с ExpressJS, то Gin очень на него похож, и работать вам с ним будет довольно удобно.
Что мы будем создавать?
Проект у нас будет стандартный. Мы создадим простой API для работы с книгами. Не волнуйтесь, хоть ваш проект и будет основан на масштабируемом подходе, сам API окажется довольно простым, и проблем с пониманием процесса не возникнет.
Что необходимо?
Вам потребуется базовое понимание Go. Лично я в качестве редактора кода использую Visual Studio Code, вы же вольны выбирать на свое усмотрение. Только имейте ввиду, что в статье вам встретится команда code . — это собственная команда VSCode, которая открывает в редакторе текущий каталог.
➡️ Читать
⚙️ Github
@Golang_google
This media is not supported in your browser
VIEW IN TELEGRAM
🎇 Echelon
Кросс-платформенная библиотека для организации логов в иерархической структуре
Настраиваемый и работает с любым терминалом, совместимым с VT100. Может использоваться из нескольких горутинов
⤷ Ссылка на проект
#Go #Windows #Logging #Useful
@Golang_google
Кросс-платформенная библиотека для организации логов в иерархической структуре
Настраиваемый и работает с любым терминалом, совместимым с VT100. Может использоваться из нескольких горутинов
⤷ Ссылка на проект
#Go #Windows #Logging #Useful
@Golang_google
🐳 Руководство по Docker для аналитика даннных.
Представьте, как вы устанавливаете программное обеспечение, требующее установку всех его зависимостей. Придется столкнуться со множеством ошибок, вручную выяснить и устранить все их причины. Каждый раз — попытки запустить всю систему заново, чтобы наконец-то правильно завершить установку… Именно в этот момент на помощь приходит Docker, пытаясь серьезно облегчить жизнь.
Содержание статьи:
1. Образы и контейнеры.
2. Запуск первой программы в Docker.
3. Основные команды контейнеров Docker.
4. Командная строка Docker-контейнера.
5. Пользовательские образы Docker.
6. Запуск веб-приложения в Docker.
7. Docker и сопоставление портов.
8. Выводы.
➡️ Читать дальше
@Golang_google
Представьте, как вы устанавливаете программное обеспечение, требующее установку всех его зависимостей. Придется столкнуться со множеством ошибок, вручную выяснить и устранить все их причины. Каждый раз — попытки запустить всю систему заново, чтобы наконец-то правильно завершить установку… Именно в этот момент на помощь приходит Docker, пытаясь серьезно облегчить жизнь.
Содержание статьи:
1. Образы и контейнеры.
2. Запуск первой программы в Docker.
3. Основные команды контейнеров Docker.
4. Командная строка Docker-контейнера.
5. Пользовательские образы Docker.
6. Запуск веб-приложения в Docker.
7. Docker и сопоставление портов.
8. Выводы.
➡️ Читать дальше
@Golang_google
modgv – инструмент, который позволяет отрендерить граф зависимостей вашего go-проекта
Позволяет конвертировать 'go mod graph' в Graphviz представление с возможностью сохранения в png
⤷ Ссылка на проект
@Golang_google | #Interesting #Go #Graph
Позволяет конвертировать 'go mod graph' в Graphviz представление с возможностью сохранения в png
⤷ Ссылка на проект
@Golang_google | #Interesting #Go #Graph
📌 Golang RPC и все-все-все…
Disclaimer: this is not another one gRPC hate article... Oh, whait...
Начнем издалека - знаете, всегда было интересно, а почему, собственно, для golang существует такое большое разнообразие библиотек, для каких-то часто используемых сущностей, как-то - роутеры http (fasthttprouter забыли, как подсказали в коментах) или cache?
С выбором RPC вроде все просто, gRPC - наше всё (вы, кстати, в курсе, что g здесь - это не Google внезапно). Но не тут-то было...
Все просто без ума от Мэри gRPC (нет).
Начнем с того, что в golang изначально реализовали net/rpc со своим сериализатором gob. Типа есть потребность - в golang есть решение из коробки (так же история, что и с роутером http - он есть, но все используют сторонние решения из-за параметризованных путей запросов). И тут засада - этот rpc можно только между golang приложениями использовать. Потом выкатили gRPC и все заверте... Вкратце - gRPC использует http/2 и protobuf для сериализации (запомним, rpc - это протокол обмена плюс сериализатор). Причем gRPC реализация доступна для многих языков, фактически нет привязки, на чем писать клиентскую и серверную часть. So far, so good...
Однако не все так гладко... Понятно стремление Google объять все возможные кейсы, но! К оригинальной реализации gRPC со временем появилось куча вопросов. Иначе как объяснить, что куча контор начали пилить свои собственные реализации RPC (и/или сериализаторов)? Также, внезапно, выяснилось, что требования к RPC внутри облака (читай между микросервисами) и RPC между клиентами за пределами облака/датацентра и сервисами внутри него (за ingress/proxy/load balancer - как хотите называйте) как бы "немножко" разные? Да и выбор http/2 в качестве транспорта - ну кто-же знал, что внедрёж пойдет не так (быстро), как ожидалось.
➡️ Читать
@Golang_google
Disclaimer: this is not another one gRPC hate article... Oh, whait...
Начнем издалека - знаете, всегда было интересно, а почему, собственно, для golang существует такое большое разнообразие библиотек, для каких-то часто используемых сущностей, как-то - роутеры http (fasthttprouter забыли, как подсказали в коментах) или cache?
С выбором RPC вроде все просто, gRPC - наше всё (вы, кстати, в курсе, что g здесь - это не Google внезапно). Но не тут-то было...
Все просто без ума от Мэри gRPC (нет).
Начнем с того, что в golang изначально реализовали net/rpc со своим сериализатором gob. Типа есть потребность - в golang есть решение из коробки (так же история, что и с роутером http - он есть, но все используют сторонние решения из-за параметризованных путей запросов). И тут засада - этот rpc можно только между golang приложениями использовать. Потом выкатили gRPC и все заверте... Вкратце - gRPC использует http/2 и protobuf для сериализации (запомним, rpc - это протокол обмена плюс сериализатор). Причем gRPC реализация доступна для многих языков, фактически нет привязки, на чем писать клиентскую и серверную часть. So far, so good...
Однако не все так гладко... Понятно стремление Google объять все возможные кейсы, но! К оригинальной реализации gRPC со временем появилось куча вопросов. Иначе как объяснить, что куча контор начали пилить свои собственные реализации RPC (и/или сериализаторов)? Также, внезапно, выяснилось, что требования к RPC внутри облака (читай между микросервисами) и RPC между клиентами за пределами облака/датацентра и сервисами внутри него (за ingress/proxy/load balancer - как хотите называйте) как бы "немножко" разные? Да и выбор http/2 в качестве транспорта - ну кто-же знал, что внедрёж пойдет не так (быстро), как ожидалось.
➡️ Читать
@Golang_google
fzf – терминальная утилита, которая представляет из себя интерактивный фильтр Unix для командной строки
Можно использовать с любым списком: файлы, история комманд, процессы, имена хостов, закладки, история git-коммов и т. д.
⤷ Ссылка на проект
@Golang_google | #Interesting #Ruby #Go #Terminal
Можно использовать с любым списком: файлы, история комманд, процессы, имена хостов, закладки, история git-коммов и т. д.
⤷ Ссылка на проект
@Golang_google | #Interesting #Ruby #Go #Terminal
✔️ [Golang] Ошибки, которые нельзя обработать
Паника в горутине
Если мы в обработчике будем использовать горутину, которая по каким-то причинам вызвала панику, Golang не сможет обработать эту панику и приложение упадет с ошибкой и все запросы, которые сейчас обрабатывает сервис оборвутся.
Eсли написать примерно вот такой код
То при вызове функции CreateUser сервис упадет.
Для того, что бы исправить это, нужно обрабатывать паники в каждой горутине
➡️ Читать дальше
@Golang_google
Паника в горутине
Если мы в обработчике будем использовать горутину, которая по каким-то причинам вызвала панику, Golang не сможет обработать эту панику и приложение упадет с ошибкой и все запросы, которые сейчас обрабатывает сервис оборвутся.
Eсли написать примерно вот такой код
type User struct {
Email string
}
func UpsertUser(r *http.Request) (User, error) {
return User{}, nil
}
func SendEmail(u User) {
panic("sending email is not implemented")
}
func CreateUser(w http.ResponseWriter, r *http.Request) {
user, err := UpsertUser(r)
if err != nil {
// handling error
}
go func() {
SendEmail(user)
// may be something else
}()
}
То при вызове функции CreateUser сервис упадет.
Для того, что бы исправить это, нужно обрабатывать паники в каждой горутине
➡️ Читать дальше
@Golang_google
UseStdLibVars: используйте переменные стандартных библиотек
Go-разработчики часто пишут свои собственные переменные или константы, а затем используют их в коде, который обращается к стандартной библиотеке. Поэтому наш Go-разработчик Саша Мелентьев создал линтер usestdlibvars, который определяет, можно ли повторно использовать переменные или константы из стандартной библиотеки, вместо того чтобы создавать собственные.
Например, вы создаете запрос. Он должен использовать какой-то метод, например, getpost, в этом случае многие разработчики так и пишут — get. Но вместо этого вы можете использовать константу из стандартной библиотеки. Вам не придётся писать лишний код, линтер сэкономит ваше время.
К примеру, вместо http.NewRequest("GET", "", nil) можете использовать http.NewRequest(http.MethodGet, "", nil) — линтер это подсветит.
Важно то, что в стандартной библиотеке много различных переменных, которые можно использовать повторно, но они не всегда подходят. Согласно стандарту, в наш линтер включены только две опции (например, проверка, связанная с внутренней библиотекой http), чтобы не было ложных срабатываний.
Название линтера, UseStdLibVars, по сути, является призывом к действию «Используйте переменные стандартных библиотек». Линтер уже включен в golangci-lint.
➡️ Читать дальше
@Golang_google
Go-разработчики часто пишут свои собственные переменные или константы, а затем используют их в коде, который обращается к стандартной библиотеке. Поэтому наш Go-разработчик Саша Мелентьев создал линтер usestdlibvars, который определяет, можно ли повторно использовать переменные или константы из стандартной библиотеки, вместо того чтобы создавать собственные.
Например, вы создаете запрос. Он должен использовать какой-то метод, например, getpost, в этом случае многие разработчики так и пишут — get. Но вместо этого вы можете использовать константу из стандартной библиотеки. Вам не придётся писать лишний код, линтер сэкономит ваше время.
К примеру, вместо http.NewRequest("GET", "", nil) можете использовать http.NewRequest(http.MethodGet, "", nil) — линтер это подсветит.
Важно то, что в стандартной библиотеке много различных переменных, которые можно использовать повторно, но они не всегда подходят. Согласно стандарту, в наш линтер включены только две опции (например, проверка, связанная с внутренней библиотекой http), чтобы не было ложных срабатываний.
Название линтера, UseStdLibVars, по сути, является призывом к действию «Используйте переменные стандартных библиотек». Линтер уже включен в golangci-lint.
go install github.com/sashamelentyev/usestdlibvars@latest
➡️ Читать дальше
@Golang_google
English for Developers - канал для тех, кто хочет учить технический английский. От создатателей популярного ит-канала Data analysis.
1. техническая лексика
2. опросы на английском
3. шутки на английском
Подписывайтесь, проходите опросы, читайте полезные прогерские фразы на английском: english_forprogrammers.
1 канал вместо тысячи учебников и курсов
1. техническая лексика
2. опросы на английском
3. шутки на английском
Подписывайтесь, проходите опросы, читайте полезные прогерские фразы на английском: english_forprogrammers.
1 канал вместо тысячи учебников и курсов
✔️ chi
Подробный гайд по интеграции JWT-аутентификации в приложение на Go + chi с использованием chi jwtauth middleware.
⚙️ Github
🗒 Гайд
@Golang_google
Подробный гайд по интеграции JWT-аутентификации в приложение на Go + chi с использованием chi jwtauth middleware.
⚙️ Github
🗒 Гайд
@Golang_google
devdash – настраиваемая панель инструментов в терминале для отображения актуальных метрик в одном месте
⤷ Ссылка на проект
@Golang_google | #Interesting #Go
⤷ Ссылка на проект
@Golang_google | #Interesting #Go
💻 Создайте собственный линтер Go за 5 минут
Создание пользовательского линтера может быть отличным способом обеспечить соблюдение стандартов кодинга и обнаружить ошибки в коде. В этом руководстве мы будем использовать Sylver, чтобы создать собственный линтер Golang всего за несколько строк кода.
➡️ Читать дальше
@Golang_google
Создание пользовательского линтера может быть отличным способом обеспечить соблюдение стандартов кодинга и обнаружить ошибки в коде. В этом руководстве мы будем использовать Sylver, чтобы создать собственный линтер Golang всего за несколько строк кода.
➡️ Читать дальше
@Golang_google