✏️ Потоковая обработка на 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
Go 1.19 Release Candidate 1 is released
https://tip.golang.org/doc/go1.19
https://github.com/golang/go/issues/new/choose
https://go.dev/dl/#go1.19rc1
@Golang_google
https://tip.golang.org/doc/go1.19
https://github.com/golang/go/issues/new/choose
https://go.dev/dl/#go1.19rc1
@Golang_google
Golang-дайджест № 18 (1 – 30 июня 2022)
Интересное в этом выпуске
Выпущены версии 1.18.3 и 1.17.11;
Go 1.19 Beta 1 Released;
Обнаружен еще один ботнет на GO;
Собеседование Часть II что там с конкурентностью?
Приятного чтения!
Читать дальше
@Golang_google
Интересное в этом выпуске
Выпущены версии 1.18.3 и 1.17.11;
Go 1.19 Beta 1 Released;
Обнаружен еще один ботнет на GO;
Собеседование Часть II что там с конкурентностью?
Приятного чтения!
Читать дальше
@Golang_google
Разработка системы заметок с нуля
Часть 1: проектирование микросервисной архитектуры
Мы спроектировали микросервисную архитектуру.
Часть 2: REST API для RESTful API Service + JWT + Swagger
Разработали RESTful API Service на Golang cо Swagger и авторизацией.
Часть 3: знакомство с Neo4j, работа над микросервисами CategoryService и APIService
Была посвящена знакомству с графовой БД Neo4j и работе над микросервисами CategoryService и APIService.
Часть 4: разработка микросервисов NoteService, TagService и UserService
Была посвящена разработке микросервисов.
Часть 5: знакомство с объектным хранилищем MinIO и разработка микросервиса на Golang
Часть 1: проектирование микросервисной архитектуры
Мы спроектировали микросервисную архитектуру.
Часть 2: REST API для RESTful API Service + JWT + Swagger
Разработали RESTful API Service на Golang cо Swagger и авторизацией.
Часть 3: знакомство с Neo4j, работа над микросервисами CategoryService и APIService
Была посвящена знакомству с графовой БД Neo4j и работе над микросервисами CategoryService и APIService.
Часть 4: разработка микросервисов NoteService, TagService и UserService
Была посвящена разработке микросервисов.
Часть 5: знакомство с объектным хранилищем MinIO и разработка микросервиса на Golang
✈️ Веб-фреймворки для Golang в 2022 году: оптимальные варианты для разработчика
Golang продолжает развиваться, вместе с ним развивается и вся экосистема языка. В частности, появляются новые и обновляются существующие фреймворки. В этой статье мы сделаем небольшой обзор тех, что связаны с HTTP-бэкендом.
Читать дальше
@Golang_google
Golang продолжает развиваться, вместе с ним развивается и вся экосистема языка. В частности, появляются новые и обновляются существующие фреймворки. В этой статье мы сделаем небольшой обзор тех, что связаны с HTTP-бэкендом.
Читать дальше
@Golang_google
Хабр
Веб-фреймворки для Golang в 2022 году: оптимальные варианты для разработчика
Golang продолжает развиваться, вместе с ним развивается и вся экосистема языка. В частности, появляются новые и обновляются существующие фреймворки. В этой статье мы сделаем небольшой обзор тех, что...
🛠 Bud GO
Веб- миннималистичый фреймворк для Go-разработчиков, который помогает упростить процесс создания, запуска и обслуживания многофункциональных веб-приложений.
На видео показан пошаговый процесс создания клона Hacker News с использованием Bud.
@Golang_google
Веб- миннималистичый фреймворк для Go-разработчиков, который помогает упростить процесс создания, запуска и обслуживания многофункциональных веб-приложений.
На видео показан пошаговый процесс создания клона Hacker News с использованием Bud.
⚙
Код⚙
Документация@Golang_google
Forwarded from Анализ данных (Data analysis)
♻️ Мета выпустила переводчик на 200 языков.
В открытом доступе теперь лежит модель No language left behind (Ни один язык не останется за бортом), которая переводит с 200+ различных языков.
Модель уже применняется для улучшения переводов на Facebook, Instagram и Wikipedia.
Код
Статья
Demo
Blog
#AI #ML #NLP
@data_analysis_ml
В открытом доступе теперь лежит модель No language left behind (Ни один язык не останется за бортом), которая переводит с 200+ различных языков.
Модель уже применняется для улучшения переводов на Facebook, Instagram и Wikipedia.
Код
Статья
Demo
Blog
#AI #ML #NLP
@data_analysis_ml
Socialhunter
Инструмент, который сканирует указанные URL-адреса и находит ссылки в социальных сетях, которые можно взломать
В настоящее время поддерживает Twitter, Facebook, Instagram и Tiktok без каких-либо ключей API.
Github: https://github.com/utkusen/socialhunter
#Go #Privacy #Interesting
@Golang_google
Инструмент, который сканирует указанные URL-адреса и находит ссылки в социальных сетях, которые можно взломать
В настоящее время поддерживает Twitter, Facebook, Instagram и Tiktok без каких-либо ключей API.
Github: https://github.com/utkusen/socialhunter
#Go #Privacy #Interesting
@Golang_google
Обработка ошибок приложений CLI в Golang
https://dev-gang.ru/article/obrabotka-oshibok-prilozhenii-cli-v-golang-tizggrwzv1/
@Golang_google
https://dev-gang.ru/article/obrabotka-oshibok-prilozhenii-cli-v-golang-tizggrwzv1/
@Golang_google
Golang - оператор fallthrough
Оператор fallthrough используется в предложении case switch. Он должен использоваться в конце предложения case.
Он используется для выполнения следующего предложения case без проверки выражения.
Читать дальше
Спецификация Go
@Golang_google
Оператор fallthrough используется в предложении case switch. Он должен использоваться в конце предложения case.
Он используется для выполнения следующего предложения case без проверки выражения.
Читать дальше
Спецификация Go
@Golang_google
@golang_interview - собираем здесь все возможные вопросы и ответы с собеседований по Go. Для всех уровней разработчиков. Присылайте свои задачи и вопросы, с которыми вы сталкивались на собеседованиях.
другие полезные ресурсы:
@golangtests - тесты и задачи GO
@golangl - чат
@GolangJobsit - вакансии и работа GO
@golang_jobsgo - чат вакансий
@golang_books - книги Golang
@golang_speak - обсуждение задач Go
другие полезные ресурсы:
@golangtests - тесты и задачи GO
@golangl - чат
@GolangJobsit - вакансии и работа GO
@golang_jobsgo - чат вакансий
@golang_books - книги Golang
@golang_speak - обсуждение задач Go
sync.Mutex
Golang известен своим параллелизмом (горутинами). Существует не только параллелизм, но и настоящий параллелизм, который можно реализовать с помощью Golang.
Таким образом, в этом случае мы должны убедиться, что несколько горутин не должны пытаться изменить ресурс одновременно, что приводит к конфликту.
Чтобы убедиться, что к ресурсу одновременно обращается только одна горутина, мы можем использовать нечто, называемое sync.Mutex.
Эта концепция называется взаимным исключением, а структура данных, обеспечивающая его, общепринятым названием — mutex.
Вариант использования без мьютекса
Давайте рассмотрим простой пример использования Mutex в горутинах.
Скажем, например, если нам нужно увеличить значение одной переменной одной горутиной и уменьшить значение той же переменной другой горутиной.
Этот пример предназначен только для понимания концепции.
Читать дальше
@Golang_google
Golang известен своим параллелизмом (горутинами). Существует не только параллелизм, но и настоящий параллелизм, который можно реализовать с помощью Golang.
Таким образом, в этом случае мы должны убедиться, что несколько горутин не должны пытаться изменить ресурс одновременно, что приводит к конфликту.
Чтобы убедиться, что к ресурсу одновременно обращается только одна горутина, мы можем использовать нечто, называемое sync.Mutex.
Эта концепция называется взаимным исключением, а структура данных, обеспечивающая его, общепринятым названием — mutex.
Вариант использования без мьютекса
Давайте рассмотрим простой пример использования Mutex в горутинах.
Скажем, например, если нам нужно увеличить значение одной переменной одной горутиной и уменьшить значение той же переменной другой горутиной.
Этот пример предназначен только для понимания концепции.
Читать дальше
@Golang_google
Forwarded from Golang вопросы собеседований
Merge sort
Реализуйте конкурентное решение merge sort (сортировка слиянием), используя горутины и каналы.
В качестве опорной точки можно взять эту последовательную реализацию:
В начале при сортировке слиянием мы рекурсивно разделяем массив на right и left стороны и на строках 30-34 вызываем MergeSort для обеих сторон.
Теперь нужно сделать так, чтобы Merge(left, right) выполнялась после получения возвращаемых значений от обоих рекурсивных вызовов, то есть и left и right должны обновляться до того, как Merge(left, right) сможет быть выполнена. Для этого на строке 26 мы вводим канал типа bool и отправляем в него true сразу после выполнения left = MergeSort(data[:mid] (строка 32).
Операция <-done блокирует код на строке 35 до инструкции Merge(left,right), чтобы она не продолжилась, пока горутина не завершится. После завершения горутины и получения true в канале done код переходит к инструкции Merge(left, right) на строке 36.
@golang_interview
Реализуйте конкурентное решение merge sort (сортировка слиянием), используя горутины и каналы.
В качестве опорной точки можно взять эту последовательную реализацию:
В начале при сортировке слиянием мы рекурсивно разделяем массив на right и left стороны и на строках 30-34 вызываем MergeSort для обеих сторон.
Теперь нужно сделать так, чтобы Merge(left, right) выполнялась после получения возвращаемых значений от обоих рекурсивных вызовов, то есть и left и right должны обновляться до того, как Merge(left, right) сможет быть выполнена. Для этого на строке 26 мы вводим канал типа bool и отправляем в него true сразу после выполнения left = MergeSort(data[:mid] (строка 32).
Операция <-done блокирует код на строке 35 до инструкции Merge(left,right), чтобы она не продолжилась, пока горутина не завершится. После завершения горутины и получения true в канале done код переходит к инструкции Merge(left, right) на строке 36.
@golang_interview
➕dynaQ
Расширение для пакета Go sql в стандартной библиотеке для поддержки динамических запросов из базы данных.
Установка: go get github.com/syke99/dynaQ
Github
Описание
@Golang_google
Расширение для пакета Go sql в стандартной библиотеке для поддержки динамических запросов из базы данных.
Установка: go get github.com/syke99/dynaQ
Github
Описание
@Golang_google
Предотвращаем утечки памяти в Go, ч. 1. Ошибки бизнес-логики
Можно любить Go за многое: за простоту и строгость, за горутины и каналы, за реализацию параллельного и асинхронного программирования, за продвинутый планировщик, за аллокатор с большим количеством оптимизаций, за высокую производительность.
Но, по сообщениям некоторых пользователей, у программ, написанных на Go, течёт память. Issue-трекер языка Go на github по запросам «high memory usage», «memory leak», «out of memory» выдаёт сотни и тысячи тикетов. А в самом популярном вопросе на stackoverflow по словосочетанию «golang memory» автор пытается разобраться, почему потребление оперативной памяти в рантайме в 4 раза превышает количество реально сделанных аллокаций. Обращения, в которых люди рапортуют о перерасходе оперативной памяти в Go, стали массовым явлением.
Что же это — утечки памяти, вызванные программистскими ошибками, или ожидаемое поведение рантайма языка? Мы попытаемся разобраться в причинах этого явления и сформулировать общие рекомендации, которые помогут в отладке проблем с потреблением памяти.
Читать дальше
@Golang_google
Можно любить Go за многое: за простоту и строгость, за горутины и каналы, за реализацию параллельного и асинхронного программирования, за продвинутый планировщик, за аллокатор с большим количеством оптимизаций, за высокую производительность.
Но, по сообщениям некоторых пользователей, у программ, написанных на Go, течёт память. Issue-трекер языка Go на github по запросам «high memory usage», «memory leak», «out of memory» выдаёт сотни и тысячи тикетов. А в самом популярном вопросе на stackoverflow по словосочетанию «golang memory» автор пытается разобраться, почему потребление оперативной памяти в рантайме в 4 раза превышает количество реально сделанных аллокаций. Обращения, в которых люди рапортуют о перерасходе оперативной памяти в Go, стали массовым явлением.
Что же это — утечки памяти, вызванные программистскими ошибками, или ожидаемое поведение рантайма языка? Мы попытаемся разобраться в причинах этого явления и сформулировать общие рекомендации, которые помогут в отладке проблем с потреблением памяти.
Читать дальше
@Golang_google
😎 Как мы себя обманываем, только бы продолжать пользоваться Golang
За два года с тех пор, как я опубликовал статью I want off Mr Golang's Wild Ride, она вновь и вновь всплывала на Reddit, Lobste.rs, на HackerNews и в других местах.
Всякий раз дискуссия выходит к одним и тем же ответам:
Вы говорите о Windows: а ведь как раз с Windows язык Go не слишком хорош! (Опять же, кого это волнует?)
Вы однобоки: о сильных сторонах Go вы не говорите!
Вы не понимаете тех компромиссов, на которые мы идем в Go.
Крупные компании используют Go, значит, не так уж он и плох!
«Правильно» моделировать задачи очень затратно, поэтому забота о корректности – спорный довод.
Корректность всегда бывает в каком-то диапазоне, Go позволяет частично пожертвовать ею ради ускорения разработки.
Вы сразу ссылаетесь на Rust, но и у него есть свои недостатки, так что ваш аргумент никуда не годится.
Т.д.
Среди комментаторов есть и громогласная фракция тех, кто всем сердцем соглашаются с моей филиппикой, но давайте сосредоточимся на разборе того явного конфликта, который здесь просматривается.
Читать дальше
@Golang_google
За два года с тех пор, как я опубликовал статью I want off Mr Golang's Wild Ride, она вновь и вновь всплывала на Reddit, Lobste.rs, на HackerNews и в других местах.
Всякий раз дискуссия выходит к одним и тем же ответам:
Вы говорите о Windows: а ведь как раз с Windows язык Go не слишком хорош! (Опять же, кого это волнует?)
Вы однобоки: о сильных сторонах Go вы не говорите!
Вы не понимаете тех компромиссов, на которые мы идем в Go.
Крупные компании используют Go, значит, не так уж он и плох!
«Правильно» моделировать задачи очень затратно, поэтому забота о корректности – спорный довод.
Корректность всегда бывает в каком-то диапазоне, Go позволяет частично пожертвовать ею ради ускорения разработки.
Вы сразу ссылаетесь на Rust, но и у него есть свои недостатки, так что ваш аргумент никуда не годится.
Т.д.
Среди комментаторов есть и громогласная фракция тех, кто всем сердцем соглашаются с моей филиппикой, но давайте сосредоточимся на разборе того явного конфликта, который здесь просматривается.
Читать дальше
@Golang_google