Как быстро и почти безболезненно вкатиться на Go вдобавок к питону
Если бы встретил такой пост год назад – сэкономил бы N часов дебаггинга граблей, которые сам же и раскидал. Сейчас, Time screen говорит, что за неделю на go пишу столько же времени, сколько и на питоне (не ноль, если что).
На го писал код для таких задач:
+ фичи в монолитный бэк с основной логикой (на go получается быстрый и легкий веб сервер),
+ в отдельный сервис для процессинга признаков и статистик
+ блендер, которые собирает рекомендации генераторов, комбинирует их в финале и делает пост-ранкинг.
Как начал писать код на го.
1. Пошел в документацию и прошел короткий go dev tour. Там на примерах познакомился с базовым синтаксисом.
2. Начал писать несложный код и посматривал в примеры вот тут и в документацию, когда писал код. Например, в gorm, который отвечает за работу с базой.
3. Пролистал effective go, но там часть инфы давно не обновлялась.
4. Здорово помогал copilot, который позволял не запоминая весь синтаксис, писать код целыми блоками.
Если бы вкатывался сейчас, то прошел бы этот курс Microsoft
🐞Возможные ошибки при переходе с питона.
Когда после питона начнете писать на го, есть соблазн ожидать похожего поведения, когда это не так.
Вот, 3 примера кода, которые на питоне и го выглядят одинаково, но ведут себя по разному. Взял примеры с array (списки на питоне) и map (словари), так как чаще всего используются эти структуры данных.
Написал примеры кода на го в playground, а в комментариях указал, что бы получилось в питоне. Поэтому советую открыть ссылку с кодом в соседней вкладке и смотреть с комментариями отсюда.
1. Слайсы в питоне – это копия участка исходного списка. Поэтому изменяя его, на исходный список вы не влияете. На го же, слайс – это участок исходного списка, поэтому если хотите получить его копию, нужно копировать явным образом.
2. В го по умолчанию переменные передаются в метод “pass by value” (в функцию передается копия значения переменной), а в питоне “pass by referenece” (передается указатель на участок памяти со значением). Это значит, что в питоне вы будете менять список, который передали в функцию, а на го будете работать с копией. Однако, на го тоже можно сделать “pass by referenece”, передав адрес переменной. Посмотрите в код, там понятнее.
3. Переменные в го инициализируются нулевыми значениями. А если вы попробуете получить элемент, которого нет, из мапы – получите нулевое значение этого типа (считайте, что map на го – это defaultdict из питона). Поэтому map в го возвращает еще boolean значение есть ли такой ключ в словаре. Вот хорошая статья о том, как устроен hashmap на го.
Еще немного ссылок.
+ Большой список ссылок по го на реддите.
+ Слак по Go на 100к людей, где даже могут отревьюить код. Называется, кстати, gophers - почти как llm от deepmind.
P.S. Поделитесь пожалуйста лекциями или статьями по устройству питона и го? Про устройство GC, GIL, scheduler в языках. И про разные штуки типа convoy effect. Тут, кстати, хорошо расписано про GIL и convoy effect на питоне.