Комментарии 69
Посоветуй хорошее руководство-учебник. (На русском языке)
не совсем учебники
https://gobyexample.com/
https://tour.ardanlabs.com/tour/eng/list
Нисколько не рекламы ради, я к ним вообще никакого отношения не имею, но для начала, именно для начала IMHO данный курс вполне подходит.
сорь, это не на русском, но мне понравился формат роадмапки. тут кем-то хорошим собраны темы в порядке важности и к ним прикреплены ссылки на несколько источников. попробуй найти аналог на русском https://roadmap.sh/golang
Так и не понял до сих пор почему от него все так "восхищаются". Только из за сборщика мусора? Какой-то C++ для тупых ленивых...
Он больше на Паскаль похож, чем на Си, и уж тем более чем на Плюсы.
А вообще кто им восхищается? Многие отзываются о нем презрительно. Нынче модно восхищаться Растом.
раст прикольный, но...помню хотел извлечь значение из мапы(проверить что оно там есть) и проверить его на <= 7. в любом языке это можно сделать в одну строку типа if key in map and map[key] <= 7. в расте я сломался - либо делай матчинг и вложенный if, либо просто 2 вложенных ифа.
сложно ответить, видимо основной хайп был от "язык от гугла". на самом деле в языке целый ряд плюсов, и на каждый плюс найдется другой язык, в котором этот плюс лучше. но вот если усреднить, то го выглядит очень хорошо
Я на него перешел с С (embedded) и говорю обычно, в нем есть все что не хватало в С - многопоточность, сборщик мусора, управление пакетам, профилирование, тестирование, форматирование средствами языка и т.д, запуск параллельной задачи одним оператором go это мощно
Так по этому то его и полюбили работадатели. Берем вкатуна с курсов, даем ему неделю и отправляем перекладывать жусоны.
Time to market (TTM) у Go получается короче, чем на C++, проверено сотнями компаний по всему миру. Плюс на С++ программистов надо брать опытных, а то в ноги себе постреляют, а на Go можно бывших PHP'шников конвертировать за две недели. А в C++ вы за две недели PHP'шников не сконвертируете ;-)
myslice := make([]int, 1)
...
for i := 1; i < 10; i++ {
...
num, _ := f1(42)
Жуткий синтаксис...
Почему нельзя использовать нормальную привычную в большинстве языков запись?
В чем мотив?
Этот язык разрабатывали не для удобства программистов, а для удобства их нанимателей. Точнее что бы низкоквалифицированные программисты не могли использовать запутанные подходы и создавать не отслеживаемые ошибки. Если ошибка игнорируется - это видно, если переменная не используется - то это тоже заметно.
С первым примером соглашусь, эта штука действительно выглядит странно, но это больше для тех, кто уже хорошо знаком с языком.
Насчет второго примера не понимаю, в чем претензия? В том, что круглые скобки не используются? Мне так наоборот, бывает непривычно уже эти круглые скобки писать :) На том же C++ такой же цикл пишется так:
for (int i = 1; i < 10; i++) {
// ...
}
А некоторые любят ++i
писать, даже споры из-за этого бывают, что быстрее. Аналогично "if expr {}
" как-то уже приятнее выглядит чем "if (expr) {}
". Кажется дело привычки.
Насчёт 3 примера тоже не понятно. Вроде стандартный синтаксис (например, в том же python вполне нормально написать a, _ = f1(42)
), чтобы развернуть tuple.
Может вам не нравится, что вместо конструкции var a = b;
пишется просто a := b
? Интересно узнать, чем же привычный для других языков синтаксис тут внезапно стал жутким.
Предлагаю тему. Написать какой-то абстрактный REST сервис на PHP и на Go. Внутри что-то там повычислять, хотя все эти эти сервисы обычно просто в другие сервисы ходят или в БД запросы делают.
Но мы будем сравнивать PHP скомпилированный, т.е. kphp и скомпилированный код на Go. Кто быстрее? Кто меньше памяти потребляет?
В чём соль? Что PHP+kphp, что Golang, оба решения нацелены на привлечение бакенд-программистов "средней" ценовой категории, с максимально быстрым time-to-market, чтобы сразу в продакшен.
Тоже сейчас потихоньку изучаю. После пхп, тем более после java очень непривычно и вызывает отторжение.
Очень интересно как вам го после java, может быть подсветите пару моментов?
Я пока не сильно погружался, и вряд-ли что-то новое напишу :))
Первое что прям сильно непривычно - очень слабая связанность. Что наверное даёт и свои преимущества. Интересно выглядит написание интерфейса, использование его без реализации, написание под это дело всех необходимых тестов.
Механизм обработки ошибок это какой-то адок. Кажется хотели сделать более явный механизм проверки ошибок, как я понимаю над этим идёт какая-то работа. Жаль что не стали try catch внедрять.
Не нравится что в угоду быстродействию(?) Экономия на спичках. Все вот эти сокращения. На сколько понимаю и переменные рекомендуется именовать кратко.
Все может быть в одном файле - интерфейс, функция, структура. Кажется что в не сильно умелых руках это может стать мощным орудием для создания говнокода.
А в целом кажется java и go нет смысла сравнивать. Совершенно разные яп. Go плохо подходит для энтерпрайз. И хорош для быстрых микросервисов.
Лично мне показался скучным. Постоянно связывает по рукам и ногам там, где можно сделать красиво и лаконично.
Насчет быстродействия ничего сказать не могу, не сравнивал. Отзыв исключительно по впечатлениям от написания кода.
вызывает отторжение.
Зачем изучать инструмент, который вызывает отторжение? Вакансий в Go кратно меньше чем в PHP и Java.
Неужели?
Гляньте Хабр Карьеру
Так вакансии размещаются не только на Хабр Карьере.
Посмотрите посты с графиками по количеству вакансий и языков.
Думаю может втянусь. Знания не бывают бесполезными. Да и смотрю сейчас достаточно много вакансий где нужен пхп+го, во многих крупных конторах сейчас пишут микросервисы на го
Более интересный вопрос - куда-бы применить возможности Go? Что-бы такого интересного написать на нем, что на ПХП не получится или получится криво?
Нейросеть
Ух как круто. Но для этого нужно разбираться как минимум в двух вещах - в Golang и нейросетях. Лично я пока новичок и в первом и во втором. Мои мысли идут пока в сторону простеньких текстовых игр, какого-нибудь сервера, стримающего mp3 в приложеньку или каких-нибудь небольших утилит (парсинг, конвертация данных) и т.д.
что на ПХП не получится или получится криво?
Маленькие и лёгкие приложения в один бинарь, без зависимостей от сторонних библиотек и интерпретаторов.
Это самоцель такая?
Где в современном мире такие вещи используются, не подскажите? Чтобы представлять целевую аудиторию.
Зачем микросервису маленький легкий "бинарь", если хоть Java Spring Boot, хоть PHP выполняют ту же задачу так же одинаково или лучше?
Как в маленький легкий "бинарь" поместиться библиотека работы с MySQL например, или AWS S3? Или для чего микросервисы используются?Маленький и легкий?
Маленький и легкий?
По сравнению с современными приложениями, например на электроне, это действительно лёгкий.
выполняют ту же задачу так же одинаково или лучше?
Не спорю что PHP или Java лучше в своей нише.
Как в маленький легкий "бинарь" поместиться библиотека работы с MySQL например, или AWS S3?
А ещё там http сервер раздающий статику из того же бинаря помещённого с помощью https://pkg.go.dev/embed
Ну, это вероятно без явного стрипа для продакшена.
К примеру, взять какой-нибудь абстрактный хэлловорлд, и написать его на PHP и Go, и если сравнить на чистой системе, сколько займёт PHP с интерпритатором и его зависимостями, и самодостаточный бинарь на Go -- второй скорее всего выйграет.
Я писал для себя утилиту скачивания фоток через апи. Почему го а не пхп? Проще многопоток организовать, я сразу 10 горутин запускаю, апи позволяет.
Конкретно в данном случае есть multi curl в php
Но в принципе - да. Многопоточность если нужна, то надо смотреть не в сторону PHP или JavaSript
Я вот решал бизнес-задачу как-то, нужно было деплоить крон таски через REST-API. Да, я вероятно недостаточно хорошо поискал и не нашел то, что решило бы мою задачу. Я решил написать свой "аналог crond", только с RESTful интерфейсом на Go и сделать всё в какой-то мере элегантно.
Да, я мог бы и на PHP это реализовать, но там бы мне пришлось использовать либо форки, и за всем этим как-то следить, либо pthreads (который я всё же побаиваюсь в проде юзать до сих пор).
На "чистом" (в кавычках, потому что с модулями, которые далеко не всегда идут в комплекте) PHP можно много чего решить, и даже далеко не всегда с особой болью (я оным уже около 15 лет занимаюсь не в шутку, и знаю о чем говорю), но некоторые вещи решать проще на других ЯП, в частности на Go. :)
У нас в энтерпрайзе это микросервисы. Они как ни крути быстрее пхп, потребляют куда меньше ресурсов чем java
Софт для какого-нибудь embedded linux устройства, где кроме минимальной rootfs больше ничего нет.
Что-бы такого интересного написать на нем, что на ПХП не получится или получится криво?
единственное что в го делается красиво это многопоточка. в остальном язык полностью убог. если что пишу 8 лет на нем.
Например, при создании новой переменной, можно использовать оператор := и тогда указывать её тип не придется.
Не так. Точнее, так, но не совсем. Го умеет выводить типы, поэтому дефолтная конструкция объявления с присваиванием
var a: int = 42
превращается в
var a = 42
И именно в этой конструкции опускается тип объявленной переменной. Для того чтобы сократить и эту запись, имеется уже означенный автором сахар:
a := 42
Всё это работает только для объявления с присваиванием. Если нужно просто объявить переменную, то без явного указания типа уже не обойтись:
var a: int
P.S. Как человек, много писавший на C#, JS и TS, а в настоящий момент часто пишущий на Python, Lua, PHP и Go, могу сказать что среди перечисленных языков Go выделяется довольно скверным синтаксисом. От нагромождения скобок слезятся глаза, отсутствие лаконичной записи обработки ошибок приводит к рассеиванию внимания на куче блоков if при чтении кода, а неявная реализация интерфейсов не позволяет узнать заранее, какой интерфейс реализует тип. И это далеко не весь список проблем. Но. Всё же синтаксис хоть и громоздкий, он ощущается весьма лаконичным, особенно при включённом автоформате. Реализация конкурентности на мой взгляд лучшая среди перечисленных мной языков - если есть большой объём данных, который можно обработать конкуретно, я без капли сомнения выберу Go. В целом язык ощущается минималистичным по возможностям и ключевым словам. Когда я только начинал с ним знакомиться, у меня было такое ощущение, словно меня заперли в палате, стены которой обиты матрацами. Но вместе с тем эта минимальность каким-то образом соседствует с богатыми возможностями, которые предлагает стандартная библиотека. Можно сказать, что Go я и люблю, и терпеть его не могу.
Спасибо за замечания. По поводу if на ошибках, я видел, что проверку ошибок оборачивают в Must, внутри, если ошибка - падаем с panic, а если ошибки нет - возвращаем значение. Но да, это далеко не все кейсы покроет
По моему мнению громоздкий синтаксис у C#, Java, Kotlin, C++
Пример синтаксиса на C# (на Java похоже)
[Anotation1]
[Anotation2(Enum.Param)]
public static void TryAddSingleton<TService, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] TImplementation>(this IServiceCollection collection)
where TService : class
where TImplementation : class, TService
{...}
У Kotlin плюс ко всему его DSL, когда вызов функции пишется как объявление функции (и получаются многоярусные вложения на несколько экранов)
val appModule = module {
single<UserRepository> { UserRepositoryImpl().apply{
this.param = MyClass.GetParam()
}
}
}
А на Golang исходный код проще всего читать, он понятнее, синтаксические конструкции прощее. Минимализм конструкций языка позволяет после пары часов изучения уже писать достаточно качественное ПО.
В Kotlin же например только 5 scope function: let, run, with, apply, и also. И программист глубоко не знакомый с языком, читая код не поймет, что там происходит? не прочитав документацию.
Ну, я описал собственные впечатления, в плане синтаксиса я бы вообще отдал предпочтение Lua.
По поводу Котлина полностью поддерживаю - запись вызова функции, которая выглядит как её объявление, вводит в ступор, подобный сахар кажется просто излишним. Такой записью грешат ещё и, если не ошибаюсь, Swift и Ruby, но в последнем передаваемая лямбда хотя бы визуально выделяется ключевым словом do.
Подписываюсь под каждым словом
Синтаксис не от мира сего, вообще никакой логики. Говорят "можно сделать только одним способом" и тут же вам сразу четыре варианта объявления одной и той же переменной. Про типы вообще непонятно зачем их методы не внутри типа, а снаружи костылями подпёрты. Странная, непривычная, не такая как у других, лексика, названия элементов языка - слайсы вместо списков, горутины вместо потоков или тасков и т.п. Обработка ошибок... сразу видно потом сбоку прикрутили, так чтобы не сломать предыдущее, не очень удачно кмк. Интерфейсы... ну, вот нельзя было в объявлении переменной указать что она сделана из интерфейса? Как в большом проекте глядя в исходник узнать что это вообще из интерфейса и из какого? никак - фиг найдёшь. Вообше большие проекты на Go бывают?
Как PHP-программист, первые недели работающий с Golang, хочу свои 5 копеек вставить.
У структур нет единой точки создания объекта, только кастомные статические конструкторы, которые использовать необязательно. Что ведёт либо к потенциальным ошибкам, либо к огромному количеству проверок на корректность заполнения полей.
Объекты-ошибки вместо исключений есть, но благодаря их обработкам код становится в среднем в 1.5 раза длиннее, чем аналогичный на PHP. Это мой опыт в моем проекте, у других людей разница может быть другой. Но она будет.
Категорически не согласен с фразой о строгой типизации языка. В нем присутствует утиная типизация, а не строгая. Твой интерфейс может случайно совпасть по сигнатуре с каким-нибудь другим, и реализующий один из этих интерфейсов класс будет реализовывать их оба, без вариантов. Либо метод структуры случайно совпадет по сигнатуре с каким-нибудь интерфейсом.
В Го нет nullable типов, но ссылки всегда могут указывать на nil. Благодаря этому даже не проинициализированная переменная любого типа содержит значение этого типа. Integer содержит 0, объект структуры - всю структуру. И нет никакого способа узнать, 0 в переменной лежит потому, что его туда сознательно положили, или это дефолтное значение.
Я отнюдь не хочу сказать, что один язык хуже или лучше другого. Они для разных целей. Го из коробки умеет быстро мапить json на структуры и делать крутую многопоточность благодаря горутинам. Моя первая программа на го - парсер сайта аренды квартир, который я написал за 15-30 минут (благодаря помощи ChatGPT :D). Но я бы не стал брать Го для вещей, где нужно описывать бизнес-логику. Уж лучше PHP: "правоверный" ООП для этого больше подходит и оставляет меньше места для ошибок.
У структур нет единой точки создания объекта, только кастомные статические конструкторы,
Объекты-ошибки вместо исключений есть, но благодаря их обработкам код становится в среднем в 1.5 раза длиннее
В Го нет nullable типов, но ссылки всегда могут указывать на nil.
просто вы думаете что go это ооп язык, и сравниваете его с java, php и подобным. но это зря. go это си с GC и всеми вытекающими.
Категорически не согласен с фразой о строгой типизации языка. В нем присутствует утиная типизация, а не строгая.
утиная типизация относится лишь к контрактам. попробуйте сложить float + int без приведения и узнаете насколько типизация строгая.
просто вы думаете что go это ооп язык, и сравниваете его с java, php и подобным
Все верно: я PHP-разработчик, а Go - новый для меня язык. Я сравниваю его с тем, к чему привык. Я понимаю, что там нет ООП, но речь не об ООП как явлении, а об оставленных возможностях. Например, создание объекта из структуры без заполнения всех обязательных полей. В PHP я бы был зол на того, кто так пишет) Но это не PHP, все верно, и ООП тут нет. Поэтому не стоит использовать этот язык там, где ООП было бы уместнее.
По последнему пункту - в таких случаях обычно используется тип переменной/поля структуры как указатель на тип (ровно как можно оперировать указателем на структуру без её инициализации)
var with_default int64
var with_nil *int64
type MyStruct1 struct {
WithDefault int64
}
type MyStruct2 struct {
WithNil *int64
}
Тут разница не только в возможности наличия nil, но и в использовании. ИМХО, использовать ссылки для возможности установки nil - плохой вариант. Например, в этом коде изначальная переменная тоже изменится:
var with_nil *int64
anotherVar := with_nil
anotherVar = 123
По ссылкам я передаю сервисы (условные синглтоны), а данные (обычно DTO) - без ссылок. Конечно, это моего кода касается: во внешний я отдаю ссылки тогда, когда он требует :)
Плюсы Go для меня, PHP и JavaScript - программиста:
Деплой. Один бинарник, завёрнутый в Scratch-образ, и всё. Когда я думаю о том, сколько всего мне надо написать, только бы выложить мой PHP-проект в прод, у меня спина холодеет.
В огромном количестве случаев не нужен Redis для хранения кэша, потому что нет ничего проще, чем самому написать примитивное key-value хранилище, которое будет прямо в памяти программы храниться.
Господи, как же мне не хватало конкуретности и долго-живущих процессов в PHP. Костыль на костыле и костылём погоняет. В Go - это просто песня!
Предыдущий пункт часто позволяет не пользоваться очередной практически обязательной зависимостью во всех серьезных PHP-проектах - Кроликом или другими очередями.
Для всего нужен только Go. Никаких композеров, никаких статических анализаторов, никаких Xdebug
Человеку, который запретил наследование в Go, надо памятник поставить. Наследование - это чистое зло, которое всегда стреляет мне в ногу в будущем, и из-за бездумного использования которого нужно половину legacy проектов переписывать, потому что это менее затратно, чем пытаться возиться с наследованием, которое там наворотили.
В общем, у меня от Go только положительные эмоции. И я постепенно буду уходить из PHP...
Golang глазами PHP-программиста