Pull to refresh

Comments 69

Посоветуй хорошее руководство-учебник. (На русском языке)

Нисколько не рекламы ради, я к ним вообще никакого отношения не имею, но для начала, именно для начала IMHO данный курс вполне подходит.

Так же не для рекламы. В настоящий момент прохожу указанный курс. Для "пощупать/покрутить" - очень здорово. Но именно для начала, всё же поверхностно некоторые вопросы проходятся.

сорь, это не на русском, но мне понравился формат роадмапки. тут кем-то хорошим собраны темы в порядке важности и к ним прикреплены ссылки на несколько источников. попробуй найти аналог на русском https://roadmap.sh/golang

Так и не понял до сих пор почему от него все так "восхищаются". Только из за сборщика мусора? Какой-то C++ для тупых ленивых...

Он больше на Паскаль похож, чем на Си, и уж тем более чем на Плюсы.

А вообще кто им восхищается? Многие отзываются о нем презрительно. Нынче модно восхищаться Растом.

раст прикольный, но...помню хотел извлечь значение из мапы(проверить что оно там есть) и проверить его на <= 7. в любом языке это можно сделать в одну строку типа if key in map and map[key] <= 7. в расте я сломался - либо делай матчинг и вложенный if, либо просто 2 вложенных ифа.

Наивный вариант в расте работает аналогичным образом:


if map.contains_key(&key) && map[&key] <= 7 { ... }

Но есть и get, который возвращает Option<&V>, с которым можно сделать что-то вроде:


map.get(&key).map(|value_ref| *value_ref <= 7).unwrap_or(false)

if map.contains_key(&key) && map[&key] <= 7 { ... }

о, спасибо. почему-то нигде не видел про этот оператор, только get.

map.get(&key).map(|value_ref| *value_ref <= 7).unwrap_or(false)

да, это я тоже видел. но так писать не хотелось.

Паникующий индексатор — штука не самая безопасная.

сложно ответить, видимо основной хайп был от "язык от гугла". на самом деле в языке целый ряд плюсов, и на каждый плюс найдется другой язык, в котором этот плюс лучше. но вот если усреднить, то го выглядит очень хорошо

Сейчас Гугл пилит ещё один язык Carbon- убийца C++ (очередной).

Я на него перешел с С (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, чтобы сразу в продакшен.

сюда бы человека, который посерьезней познакомился с го, было бы интересно послушать мнение

Не надо kphp, лучше php+roadrunner

kphp приемлемо могут готовить пожалуй только во ВКонтакте

Тоже сейчас потихоньку изучаю. После пхп, тем более после java очень непривычно и вызывает отторжение.

Очень интересно как вам го после java, может быть подсветите пару моментов?

Я пока не сильно погружался, и вряд-ли что-то новое напишу :))

Первое что прям сильно непривычно - очень слабая связанность. Что наверное даёт и свои преимущества. Интересно выглядит написание интерфейса, использование его без реализации, написание под это дело всех необходимых тестов.

Механизм обработки ошибок это какой-то адок. Кажется хотели сделать более явный механизм проверки ошибок, как я понимаю над этим идёт какая-то работа. Жаль что не стали try catch внедрять.

Не нравится что в угоду быстродействию(?) Экономия на спичках. Все вот эти сокращения. На сколько понимаю и переменные рекомендуется именовать кратко.

Все может быть в одном файле - интерфейс, функция, структура. Кажется что в не сильно умелых руках это может стать мощным орудием для создания говнокода.

А в целом кажется java и go нет смысла сравнивать. Совершенно разные яп. Go плохо подходит для энтерпрайз. И хорош для быстрых микросервисов.

Спасибо, что поделились своим опытом

На сколько знаю, он в ГО и создавался для микросервисов, но многие его пихают везде где можно и нельзя, такая же история была с python

Лично мне показался скучным. Постоянно связывает по рукам и ногам там, где можно сделать красиво и лаконично.
Насчет быстродействия ничего сказать не могу, не сравнивал. Отзыв исключительно по впечатлениям от написания кода.

вызывает отторжение.

Зачем изучать инструмент, который вызывает отторжение? Вакансий в Go кратно меньше чем в PHP и Java.

Неужели?

Гляньте Хабр Карьеру

Так вакансии размещаются не только на Хабр Карьере.

Посмотрите посты с графиками по количеству вакансий и языков.

Хотите сказать Хабр карьера нерелеванта фактическому положению на рынке вакансий в несколько раз?

Статистика, где нет Java, но есть "iOS",собранная непонятно как с непонятно какого сайта лучше Хабр Карьеры?

Ок

Думаю может втянусь. Знания не бывают бесполезными. Да и смотрю сейчас достаточно много вакансий где нужен пхп+го, во многих крупных конторах сейчас пишут микросервисы на го

Более интересный вопрос - куда-бы применить возможности Go? Что-бы такого интересного написать на нем, что на ПХП не получится или получится криво?

Ух как круто. Но для этого нужно разбираться как минимум в двух вещах - в Golang и нейросетях. Лично я пока новичок и в первом и во втором. Мои мысли идут пока в сторону простеньких текстовых игр, какого-нибудь сервера, стримающего mp3 в приложеньку или каких-нибудь небольших утилит (парсинг, конвертация данных) и т.д.

что на ПХП не получится или получится криво?

Маленькие и лёгкие приложения в один бинарь, без зависимостей от сторонних библиотек и интерпретаторов.

Это самоцель такая?

Где в современном мире такие вещи используются, не подскажите? Чтобы представлять целевую аудиторию.

Где в современном мире такие вещи используются, не подскажите?

  • Микросервисы в scratch контейнере

  • Различные утилитки, например k9s

  • ...

  1. Зачем микросервису маленький легкий "бинарь", если хоть Java Spring Boot, хоть PHP выполняют ту же задачу так же одинаково или лучше?
    Как в маленький легкий "бинарь" поместиться библиотека работы с MySQL например, или AWS S3? Или для чего микросервисы используются?

  2. Маленький и легкий?

Маленький и легкий?

По сравнению с современными приложениями, например на электроне, это действительно лёгкий.

выполняют ту же задачу так же одинаково или лучше?

Не спорю что 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, а если ошибки нет - возвращаем значение. Но да, это далеко не все кейсы покроет

Соль в том, что 99,9% ошибок никак не должны приводить к панике, они должны быть именно обработаны. Паника - это крайний случай, я её обычно вызываю только в функции main, если не завелось что-то очень критичное.

По моему мнению громоздкий синтаксис у 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 бывают?

Туда же и docker, и gitea (aka gogs)...

Как 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...

Sign up to leave a comment.

Articles