Синтаксис Go, часть 1: полезные штуки, которых нет в Java
Некоторое время назад я начала изучать Go. Мотивация очень простая:
🔸 Популярность. Go занимает 4 место в Европе среди языков бэкенда. У Озона, Ламоды, ВК, Авито и других больших ребят есть сервисы на Go
🔸 Интерес. От языка, созданного гуглом, жду интересных идей и подходов к старым проблемам
🔸 А вдруг го лучше джавы? Может новые микросервисы писать на Go? Вдруг пора менять стэк и заводить канал Go: fill the gaps? Хочется разобраться и составить мнение на этот счёт
Первый шаг в изучении языка — синтаксис и стандартные библиотеки. Я человек простой, и тоже иду по этому пути.
Для большинства конструкций в Go можно легко найти аналоги в java. В этом посте я рассказажу об особенностях го, у которых НЕТ прямых аналогов в джаве.
Если бы я писала пост летом, то первым пунктом стали бы горутины, киллер-фича Go. В java 19 вышли виртуальные потоки, которые на первый взгляд похожи на горутины. В нюансах я когда-нибудь разберусь, а сейчас расскажу, чего в джаве точно нет:
1️⃣ Можно вернуть несколько значений из функции
Вернуть два значения — сверхпопулярный кейс, во многих java проектах для этих целей используют Map.Entry или создают класс Pair.
До сих пор не понимаю, почему в джаве нельзя вернуть пару. Технически это не должно быть сложно, можно сделать что-то среднее между дженериками и LambdaMetaFactory. Или добавить класс Pair в стандартную библиотеку.
2️⃣ Нет наследования
Только интерфейсы и композиция. Никаких проблем с абстрактными классами и сложными иерархиями. Одобряю👌
3️⃣ Объект можно передать по ссылке и по значению
В java всё однозначно:
▪️
▪️
В Go вариантов больше:
▫️
▫️
▫️
▫️
4️⃣ Оператор select
для получения самого быстрого результата от асинхронных задач.
Как это выглядит: допустим, мы отправили три задачи в асинхронное исполнение. Пишем:
Самый близкий java аналог — конструкция
За кадром осталось много конструкций, которые выглядят по-другому, но я пока не поняла, чем они лучше аналогов в java. Возможно, когда перейду к изучению лучших практик, плюсы станут более весомыми. А может и нет:)
Но не всё так радужно, и в следующем посте опишу особенности Go, которые мне НЕ понравились😈
Некоторое время назад я начала изучать Go. Мотивация очень простая:
🔸 Популярность. Go занимает 4 место в Европе среди языков бэкенда. У Озона, Ламоды, ВК, Авито и других больших ребят есть сервисы на Go
🔸 Интерес. От языка, созданного гуглом, жду интересных идей и подходов к старым проблемам
🔸 А вдруг го лучше джавы? Может новые микросервисы писать на Go? Вдруг пора менять стэк и заводить канал Go: fill the gaps? Хочется разобраться и составить мнение на этот счёт
Первый шаг в изучении языка — синтаксис и стандартные библиотеки. Я человек простой, и тоже иду по этому пути.
Для большинства конструкций в Go можно легко найти аналоги в java. В этом посте я рассказажу об особенностях го, у которых НЕТ прямых аналогов в джаве.
Если бы я писала пост летом, то первым пунктом стали бы горутины, киллер-фича Go. В java 19 вышли виртуальные потоки, которые на первый взгляд похожи на горутины. В нюансах я когда-нибудь разберусь, а сейчас расскажу, чего в джаве точно нет:
1️⃣ Можно вернуть несколько значений из функции
name, count := processUser(user)Подобные штуки доступны и в других языках, например, в Python.
Вернуть два значения — сверхпопулярный кейс, во многих java проектах для этих целей используют Map.Entry или создают класс Pair.
До сих пор не понимаю, почему в джаве нельзя вернуть пару. Технически это не должно быть сложно, можно сделать что-то среднее между дженериками и LambdaMetaFactory. Или добавить класс Pair в стандартную библиотеку.
2️⃣ Нет наследования
Только интерфейсы и композиция. Никаких проблем с абстрактными классами и сложными иерархиями. Одобряю👌
3️⃣ Объект можно передать по ссылке и по значению
В java всё однозначно:
▪️
void m(int value)
— примитив копируется и манипуляции с value не отразятся на переданной переменной▪️
void m(User user)
— ссылка копируется, но указывает на тот же объектВ Go вариантов больше:
▫️
func m(value int)
— примитив копируется как в джаве ▫️
func m(value *int)
— передаём ссылку на примитив, внутри метода ей можно присвоить другое значение▫️
func m(value User)
— в метод передаётся полная копия объекта▫️
func m(value *User)
— передаём исходную ссылку на объект. Её можно переприсвоить новому объекту, и сам объект, конечно, можно менять4️⃣ Оператор select
для получения самого быстрого результата от асинхронных задач.
Как это выглядит: допустим, мы отправили три задачи в асинхронное исполнение. Пишем:
select {Какая задача первой вернёт результат, такой код и выполнится. При этом нам сразу доступен результат завершённой задачи.
результат задачи 1: код А
результат задачи 2: код Б
результат задачи 3: код Ц
}
Самый близкий java аналог — конструкция
CompletableFuture.anyOf(задача1, задача2, задача3).thenRun(код)Код в
thenRun
выполнится, когда одна из задач завершится. Затем нужно пройтись по всем объектам CompletableFuture, чтобы выяснить, какая именно задача завершилась, и забрать у неё результат. В go эту задачу выполнить гораздо проще.За кадром осталось много конструкций, которые выглядят по-другому, но я пока не поняла, чем они лучше аналогов в java. Возможно, когда перейду к изучению лучших практик, плюсы станут более весомыми. А может и нет:)
Но не всё так радужно, и в следующем посте опишу особенности Go, которые мне НЕ понравились😈
👍36🔥5👎2💩2❤1👏1
Опыт использования KrakenD от разработчиков МТС Travel
KrakenD — это готовое решение, которое используется в МТС Travel для реализации API-шлюза, важной штуки для продуктов с микросервисной архитектурой.
Туристический сервис появился у МТС в прошлом году, сейчас с помощью него можно забронировать отели по всей России, а также за рубежом. В базе уже более 16000 предложений различных отелей, хостелов и апартаментов.
Опыт МТС Travel может может пригодиться разработчикам из других сервисов. Подробнее о нем читайте в статье на Хабре.
KrakenD — это готовое решение, которое используется в МТС Travel для реализации API-шлюза, важной штуки для продуктов с микросервисной архитектурой.
Туристический сервис появился у МТС в прошлом году, сейчас с помощью него можно забронировать отели по всей России, а также за рубежом. В базе уже более 16000 предложений различных отелей, хостелов и апартаментов.
Опыт МТС Travel может может пригодиться разработчикам из других сервисов. Подробнее о нем читайте в статье на Хабре.
Хабр
Выпускайте Кракена: опыт использования KrakenD
Привет, Хабр! Меня зовут Владимир Калугин, я руковожу бэкенд-разработкой в МТС Travel . Этот сервис появился у МТС в прошлом году, сейчас у нас можно забронировать отели по всей России, а также за...
🔥5🤯3🤡3👍1💅1
🔥2👍1
Чат-бот под несколько месенджеров
💎 Чат: ссылка
Привет, я Паша, руковожу эксплуатацией инфраструктуры крупного хайлоад-проекта. Хочу поделиться опытом разработки бота на Golang для различных мессенджеров.
Подробнее: https://habr.com/ru/post/649413/
💎 Чат: ссылка
Привет, я Паша, руковожу эксплуатацией инфраструктуры крупного хайлоад-проекта. Хочу поделиться опытом разработки бота на Golang для различных мессенджеров.
Подробнее: https://habr.com/ru/post/649413/
👍5🔥1💩1
👍5
Почему я перешёл с Python на Go: choose your fighter
💎 Чат: ссылка
Привет, Хабр! Меня зовут Саша, я бэкенд-разработчик в Ozon. Пишу платформу для контента, который генерят пользователи: отзывов, комментов, вопросов, ответов. Раньше я писал на Python. Выбрал его изначально из-за лёгкого синтаксиса и большого количества вакансий для Python-разработчиков — изи катка для входа в профессию.
Подробнее: https://habr.com/ru/company/ozontech/blog/598381/
💎 Чат: ссылка
Привет, Хабр! Меня зовут Саша, я бэкенд-разработчик в Ozon. Пишу платформу для контента, который генерят пользователи: отзывов, комментов, вопросов, ответов. Раньше я писал на Python. Выбрал его изначально из-за лёгкого синтаксиса и большого количества вакансий для Python-разработчиков — изи катка для входа в профессию.
Подробнее: https://habr.com/ru/company/ozontech/blog/598381/
👍6
👣 Код дает разные значения для b1 и b2
Почему?
Ответ
Почему?
Ответ
package main
func main() {
const s1 = "Hi World!"
s2 := s1 + ""
println(s1 == s2) //true
println(len(s1) == len(s2)) //true
var b1 byte = 1 << len(s1) / 128 // ==4
var b2 byte = 1 << len(s2) / 128 // ==0
println(b1, b2) // 4 0
}
👍7
👍2
Микрооптимизация кода на Go на примере простого веб-сервиса
💎 Чат: ссылка
Привет, Хабр! Я работаю старшим Go-разработчиком в «Лаборатории Касперского». Сегодня хочу поговорить о том, как искать узкие места и оптимизировать код на Go. Разберу процесс профилирования и оптимизации на примере простого веб-сервиса — покажу, с помощью каких встроенных инструментов искать функции, активнее всего использующие CPU и память. Расскажу, какие можно применять подходы, чтобы повысить производительность. Хотя речь пойдет о микрооптимизации, в моем примере шаг за шагом производительность удалось поднять в 5 раз!
Подробнее: https://habr.com/ru/company/kaspersky/blog/591725/
💎 Чат: ссылка
Привет, Хабр! Я работаю старшим Go-разработчиком в «Лаборатории Касперского». Сегодня хочу поговорить о том, как искать узкие места и оптимизировать код на Go. Разберу процесс профилирования и оптимизации на примере простого веб-сервиса — покажу, с помощью каких встроенных инструментов искать функции, активнее всего использующие CPU и память. Расскажу, какие можно применять подходы, чтобы повысить производительность. Хотя речь пойдет о микрооптимизации, в моем примере шаг за шагом производительность удалось поднять в 5 раз!
Подробнее: https://habr.com/ru/company/kaspersky/blog/591725/
👍12
🔥 Шпаргалка по структурам данных в Go
Некоторые компании проводят собеседования с online написанием кода. Требуется решить олимпиадную задачку на скорость. В таких условиях нет времени посмотреть подробности реализации структур данных — нужно сразу реализовать идею.
Но курсы по алгоритмам и структурам данных дают примеры или на псевдокоде, или на С++. Ещё эталонные решения задач написаны зачастую на С++. Готовясь к собеседованию, составил шпаргалку библиотек — аналогов контейнеров STL, что бы не тратить драгоценное время на поиск.
Чат: ссылка
Подробнее: https://m.habr.com/ru/post/456194/
Некоторые компании проводят собеседования с online написанием кода. Требуется решить олимпиадную задачку на скорость. В таких условиях нет времени посмотреть подробности реализации структур данных — нужно сразу реализовать идею.
Но курсы по алгоритмам и структурам данных дают примеры или на псевдокоде, или на С++. Ещё эталонные решения задач написаны зачастую на С++. Готовясь к собеседованию, составил шпаргалку библиотек — аналогов контейнеров STL, что бы не тратить драгоценное время на поиск.
Чат: ссылка
Подробнее: https://m.habr.com/ru/post/456194/
👍3👎2
Интерфейсы в Go — как красиво выстрелить себе в ногу
Первый очерк из цикла приключений в мире сусликов.
С этой статьи начинается серия небольших рассказов о необычных подводных камнях, которые можно встретить в начале разработки на Go. В статьях будут примеры кода, будьте с ними аккуратнее - не все из них будут компилироваться и работать, читайте внимательно комментарии, везде будет указано, на какой строке происходит ошибка. Также в блоках кода везде табуляция заменена на пробелы - это сделано намеренно, чтобы статьи выглядели у всех одинаково.
💎 Чат: ссылка
Подробнее: https://habr.com/ru/post/597461/
Первый очерк из цикла приключений в мире сусликов.
С этой статьи начинается серия небольших рассказов о необычных подводных камнях, которые можно встретить в начале разработки на Go. В статьях будут примеры кода, будьте с ними аккуратнее - не все из них будут компилироваться и работать, читайте внимательно комментарии, везде будет указано, на какой строке происходит ошибка. Также в блоках кода везде табуляция заменена на пробелы - это сделано намеренно, чтобы статьи выглядели у всех одинаково.
💎 Чат: ссылка
Подробнее: https://habr.com/ru/post/597461/
👍3
Создание базового RESTful (CRUD) с помощью Golang и MySQL
Мы будем разрабатывать приложение, которое предоставляет базовый сервер REST-API для операций CRUD для управления пользователями (id, firstName, lastName, age).
💎 Чат: ссылка
Подробнее: http://bit.ly/3IVkozD
Мы будем разрабатывать приложение, которое предоставляет базовый сервер REST-API для операций CRUD для управления пользователями (id, firstName, lastName, age).
💎 Чат: ссылка
Подробнее: http://bit.ly/3IVkozD
👍5👎2