Как стать автором
Обновить

Переход с Python на Go: мысли человека, которому иногда сложно

Уровень сложностиПростой
Время на прочтение2 мин
Количество просмотров4.2K

Решил перейти на Go. Причина простая — видел вакансии с зарплатой выше 100 тысяч, и почти везде Go. Я до этого писал в основном на Python. Немного Django, немного микросервисов, WordPress. Закончил онлайн-школу, работаю уже третий год. Решил, что пора прокачиваться и становиться программистом-полиглотом.

Вот мой опыт и небольшие замечания по языку:

Первый шок — это main

Когда я писал на Python, всё было просто: написал функцию — она работает. Хочешь — запускаешь что-то напрямую. Хочешь — импортируешь. А в Go сразу надо делать package main, потом func main(), и только внутри уже можно что-то писать.

Сначала я подумал, что это какая-то обёртка, типа как if name == "__main__" в Python, но, похоже, нет. Тут без main вообще ничего не запускается. Это немного сбивает. Почему язык не может просто начать выполнять файл с первой строки?

Типы… странные

Я привык, что переменные сами понимают, кто они. В Python пишешь a = 5, потом a = "текст" — и всё нормально.

В Go, если ты сказал, что a int, то всё — никаких "текстов" туда не положишь. Я не сразу понял, как это работает. Ещё есть :=, и я не сразу понял, чем := отличается от =. Оказалось, := — это когда переменную создаёшь. А = — когда она уже есть. Почему нельзя просто одно оставить?

Ошибки — это не исключения

Один раз написал функцию и ждал, что она кинет ошибку, как в Python. Но ничего не произошло. Потом почитал — в Go ошибки возвращаются как второй аргумент. То есть надо делать вот так:

res, err := myFunc()
if err != nil {
    // что-то делать
}

Честно — поначалу раздражало. Зачем я должен писать одну и ту же проверку в каждом вызове функции? Но, видимо, так принято.

Нет списков, есть слайсы

Я думал, что список — это просто [], как в Python. А оказалось, это слайсы. А ещё есть массивы. Они разные, хотя похожи. Разницу между слайсами и массивами и прочие тонкости реализации очень любят спрашивать на собеседованиях, рассчитывая отсеить людей без высшего образования.

Циклы без range(len(...))

В Python я часто писал:

for i in range(len(arr)):
    print(arr[i])

А в Go так нельзя, так как это парадигменный язык. Там пишут через range сразу:

for i, val := range arr {
    fmt.Println(val)
}

Нет классов. В смысле вообще

Я хотел сделать класс. Типа, как в Python — class MyService: и туда методы. А в Go классов нет. Есть struct, и ты к ним можешь привязать функции. Типа методы. Но это не совсем то же самое. Там надо через func (s *MyService) Do() писать. Звездочка - означает что ты берешь данные из оперативной памяти.

Мне кажется, тут можно было бы сделать проще.

Заключение

Я пока не могу сказать, что Go мне нравится. Там многое непонятно. Некоторые вещи кажутся лишними. Типы, main, ошибки — всё это можно было бы сделать проще. Но тогда любой бы смог выучить Golang.

Если честно, я до сих пор не уверен, правильно ли я всё делаю. Но, наверное, если разобраться, то привыкну.

Пока продолжаю учиться. Если через месяц всё ещё будет трудно — вернусь к Python. Но хочется верить, что получится.

Теги:
Хабы:
-16
Комментарии35

Публикации

Работа

Data Scientist
41 вакансия
Go разработчик
85 вакансий

Ближайшие события