Решил перейти на 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. Но хочется верить, что получится.