Pull to refresh

Comments 72

Go-Рик… Теперь я видел все, связанное с этим сериалом)

Почему бы не написать о недостатках? Заколебали уже, если честно, писать о Go как о серебряной пуле.

Кажется каждая вторая статья про Go на хабре освещает недостатки.
Наверно это случайно получается?
Нет, в компенсацию вот таким вот статьям.
Я выучил Go (уже зная C, Python и Lua), начал делать на нём side проект для web и пожалел об этом.
Самый большой недостаток Go — это ad-hoc полиморфизм.
Нафиг, только динамическая типизация или нормальные системы типов (как в F#, например).
К тому же (имхо) нет ниши, в которой Go был бы уникален. Контейнеры? А теперь почитайте что нагородили разработчики Kubernetes — фактически свою систему типов (с generics, да) поверх Go:
In short, Kubernetes has built a type naming & identification scheme and a type registry to store each GVK. It took me a long time to identify (pun intended!) this whole thing in the codebase; after I did, I was amazed and impressed.

The core team replaced a compile-time language feature that was missing (Generics) with their home-built runtime system. And given the tools at their disposal, they did a pretty good job.
К тому же (имхо) нет ниши, в которой Go был бы уникален.

Не то, чтобы уникален, но GC, CSP и компиляция в бинарник доступна очень для немногих, а именно в таком виде (все сразу и на уровне языка, а не библиотек), так и вообще в единственном экземпляре.


Думаю Go оседлал два тренда: минимизация окружения в рантайм и параллельность с минимальными паузами GC.

Я бы еще записал сюда очень простую кросс-компиляцию. Для одного из своих проектов я выбрал именно Golang, потому что нужно было написать утилитку для одного очень специфичного устройства на андроидолинуксе, где не то что Python или Perl, даже Bash не было.


GOARCH=arm GOOS=linux go build


Копируем бинарник через telnet и все работает.

Я его выбрал из-за того, что в продакшн у нас шла лишь одна бинарка: в scratch image докера добавлялась бинарка и потом всё шло в кубернетес. Очень удобно. Разбер образа составлял ~12 МБ В случае с ПХП и Руби, всё было несколько сложнее (ну и размер посложнее). На гоу оказалось очень быстро и эффективно писать различные микросервисы в качестве посредника между внутренней кухней и фронтендом, а также демоны для работы с очередями, и просто микроутилитки. Я бы взвесил все за и против, если бы нужно было писать что-то увесистое, но в случае с микрослужбами в прямом смысле первой части слова — «микро», я ни разу не пожалел, что сделал такой выбор.
Второй недостаток Go (имхо) — отсутствие tail-call optimization
UFO just landed and posted this here
Поддерживаю: я так и не понял, зачем же мне учить Go)
хотели сказать, чтобы вы шли на курсы программирования в Geekbrains, который принадлежит mail.ru, чтобы потом пойти работать в mail.ru, который переехал на Go по фану, а теперь страдает от недостатка людей, которые знают Go. Поэтому в статье не сказано ничего конкретного, а только — это сделано Гуглом, это быстро, это просто и оно работает. Но нет ни технических деталей, ни недостатков языка, которых тоже немало.
Я тоже не понял зачем ещё одна такая статья.
Похоже, это мотивирующая напоминалка. Срабатывает раз в месяц.
Я только в конце понял зачем. Реклама курса.
Есть интересные статьи про go: о сборке мусора, об оптимизациях, о том как работают интерфейсы/структуры/… и есть очередная реклама.
И где там UI? Пока только биндинги.
Спешить некуда. Ещё не все изобрели свои велосипеды.
в связке html,css, js замечательно работает, лучше всяких QT, C#
А есть примеры real-world-проектов с кроссплатформенным GUI на GO? Существует реализация реактивных расширений для GO, было бы интересно посмотреть на что-нибудь в связке с ней — а у них в ридми нет ссылок на готовые проекты :(

Я на работе использую в связке с vue.js и jQuery. Go умеет быть файловым сервером, пишется это в одну строчку. Далее пишется фронт на любом любимом фреймворке, и общение между фронтом и шоу по rest API. Приложения десктопные И такая связка реализуется в продукте быстрее чем на qt, при том что я ни вёрстку, ни веб разработку не умел и всё это с нуля учил в отличие от qt или c# с его winforms или ещё какой фиговиной

Далее пишется фронт на любом любимом фреймворке, и общение между фронтом и шоу по rest API.


Это замечательно, и я вообще не отрицаю, что Go для бека офигенен. Но обещали таки UI…

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


  • деньги и спрос на рынке труда
  • желание изучить этот язык

Остальное — вода

При этом "желание изучить этот язык" проистекает из денег и спроса на рынке труда

Не всегда. Иногда язык выбирается исходя из того как быстрее сделать какой-то проект (или хотя бы прототип). Но в этом случае Go не дает никаких преимуществ, если человек уже знает что-то из C/C++/C#/Java. Если производительность не играет существенной роли, то сюда можно добавить знание любого другого языка.

Правда, есть ещё категория энтузиастов, которые чисто из вредности решают задачи на не очень подходящим для них языке (те самые которые пишут веб-сервера на bash или редакторы текста на postscript) — они вряд-ли интересуются деньгами или спросом на рынке труда.
А, где посмотреть на редактор на PostScript?
Боюсь уже не найду, это было больше 10 лет назад. Помню только что автор был какой-то студент из MIT, написал его под ghostscript. Я был впечатлён и поэтому запомнил.
Может у вас так, но это не значит что у всех так. Сомневаюсь что люди изучают как написать программу на Malborge, потому что на этом языке есть вакансии) Для тех же функциональных языков это может быть «потому что это о*уенно»
да просто посмотрите блог «ненормальное программирование»

Рискуя нарваться на минусы, все же попытаюсь разобраться и понять, о чем речь в статье. Со стороны звучит так, будто бы статья должна заинтересовать меня (некоего абстрактного разработчика) и разрекламировать мне Golang. Представим на минуту, что я ни разу не видел даже строчки кода на Go (это близко к правде). Какие у языка преимущества (судя по статье):


1) Простота. Собственно, это была основная цель создания языка, и ее удалось достичь. У Go достаточно простой синтаксис

Верю на слово, но т.к. рядом нет ни строчки кода, мне сравнить не с чем.


2) Большое количество библиотек. Если вам не хватает какой-либо возможности в Go, можно воспользоваться одной из множества библиотек и выполнить требуемую задачу. У Go есть еще одно преимущество — можно без проблем взаимодействовать с библиотеками языка Си. Есть даже мнение, что Go-библиотеки — это обертки для C-библиотек.

Сейчас только ленивый с C-библиотеками не взаимодействует. Ладно, запишем в плюс.


3) Чистота кода. Компилятор Go позволяет держать код «чистым».

Игнорируя тот факт, что упомянутая в этом абзаце ссылка — битая, я все-таки не очень понимаю, почему фичей языка являеся форматирование сторонней утилитой? Тогда любая тяжеловесная IDE в нагрузку к энтерпрайз-языку — это тоже "фича" языка? Из текста не ясно, насколько я не прав.


4) Статическая типизация.

Верю, что преимущество, но по сравнению с чем?


5) GoDoc.

Сторонняя утилита. Чем она проще чем аналоги для других стеков? Может пример есть?


6) Обслуживание кода. Его легко обслуживать именно благодаря простому и лаконичному синтаксису.

Я полностью согласен, осталось только увидеть этот "лаконичный" синтаксис в сравнении хоть с чем-то.


7) При этом в Golang нет классов (есть структуры, struct), нет поддержки наследования, что значительно упрощает изменение кода. Плюс нет исключений, аннотаций и т.п.

Окей, а чем это заменяется? Что вместо исключений, например?


8) Что можно написать на Go
Практически все, за исключением некоторых моментов (например, разработки, связанные с машинным обучением — здесь больше подходит все же Python с низкоуровневыми оптимизациями на C/C++ и CUDA).

Но у вас же обертки и C-библиотеки. С ними действительно можно написать что угодно.


9) Все остальное можно писать, особенно это актуально в отношении web-сервисов. Кроме того, на Go стоит разрабатывать приложения как для конечного пользователя, так и для разработки демонов, UI, он подходит для кроссплатформенных приложений и сервисов.

Ну вот хороший же пример — UI на Go. Я, например, не встречал (потому что мало интересовался). Пример приложения или упрощения рутинных задач по сравнения с более сложными языками был бы очень кстати. Но, как говорится, увы.


Я открыл статью, потому что захотел узнать, "Зачем мне учить Go", но так и не увидел никакого конкретного примера, почему я должен выкинуть свой древний и бесполезный язык и пересесть на Go, кроме зарплаты. Зарплаты, динамика которой (согласно данным по ссылке на Мой круг) находится на уровне с C# и Python, и катастрофически проигрывает Swift и Objective-C. И да, я не нашел в статье ничего по ключевому слову "инфляция", что, с учетом указанной валюты, мягко говоря превращает эту динамику в 0.

Справедливости ради, gofmt и godoc — часть базового тулинга языка (до кучи с gotest и т.д.). В остальном вы правы, статья на уровне «я прочитал методичку».
«Статья готовилась совместно с преподавателем курса Golang в GeekBrains Сергеем Кручининым, за что ему огромное спасибо!»
Ощущение, что написана статья только ради этого.
Из 200+ вакансий не увидел ни одну с node.js/React (2ой по населению город в Греции). Про go уж молчу. Увижу лет через пять наверное… и как обычно будут требовать с 5+ летним опытом
Не мог бы преподаватель «курса Golang» пояснить мне и некоторым другим прочитавшим статью как сделать UI на Go. Может я чего пропустил, или это просто опечатка?
Вообще как для Mail статья слабовата, для меня была бы ОК, но не для Mail.
Мог бы! Вот заплатите денюшек, пройдёте курсы и будет вам счастье.
(ну это мой субъективный вывод от статьи)
Какая же классная картинка, как раз нужна была новая кружка.
уже заказал себе новую кружку с этим логотипом :). Спасибо за идею!
Тема сисек «зачем изучать GO» не раскрыта. :-)

Будет, он как одни ЯП от Гугла забыт и заброшен.
Или, например как Ангуляр, переделаны так, что версия 2 будет слабо совместима с версией 1? (Предпосылки к этому есть)
(Предпосылки к этому есть)


Что за предпосылки?
Как минимум во второй версии будет изменена система модулей.
Добавлены генерики и обработка исключений.
Возможно что-то еще измениться.
В общем будет ка было с Ангуляр.
Как минимум во второй версии будет изменена система модулей.

Шо опять?! Я только приспособился к go mod («vgo»)… Можно пруф?

Добавлены генерики

Это не совсем и дженерики будут, но это лишь расширение языка, не нарушающее обратную совместимость.

и обработка исключений.

Серьезно? Можно пруф? Введение исключений в язык — это ведь фундаментальное изменение, которое не факт, что комьюнити примет.
Как минимум во второй версии будет изменена система модулей


Ну, собственно go modules есть и работает уже сейчас. Ничего из breaking changes не замечено.

Добавлены генерики


Первый вопрос: вы же внимательно читали, что по поводу дженериков авторы языка говорили. А то есть мнение, что дженерики могут оказаться достаточно специфичными.

Второй вопрос: а что из существующей экосистемы должны сломать дженерики? В чем поломается обратная совместимость?

обработка исключений


Вы это где прочитали? То, что должен появиться некоторый «сахар» для обработки ошибок — да, и не только должен появиться, но уже есть. Опять же ничего не сломалось. А по поводу исключений (специально перепроверил) позиция прежняя: ошибка — это значение, т.е. исключений нет и не предвидится.

Вы, в общем, хотя бы из оригинала golang-blob информацию брать попробуйте, что ли, а не из желтой прессы. Там вам прямо и расскажут: «так, мол, и так, развитие языка идет итеративно, в планах сахар для обработки ошибок, некоторые фичи обобщенного программирования, типа-дженерики, возможно на встроенной кодогенерации, а может что-то другое придумаем, пробуем разные подходы. Модули — можете уже пользоваться, это некоторая итерация чуточку более продвинутого вендоринга. Вторая версия — ну, вероятно, чтобы зафиксировать завершение этапа запланированных расширений синтаксиса, версию после 1.6 переименуем в 2.0. Но это так — поржать, по сути слома совместимости не планируется. Язык будем держать как можно более простым, ничего из того, что в планах, поломать что-то не должно».

Ну, в общем, Go не Swift, ломать что-то не собираются. Собственно, гуглу это не выгодно. У него на Go достаточно большая кодовая база, переписывать никто не хочет.
Мне не нравится в языке Go их логотип тупого хомяка с выпученными глазами. Это уже создает негативное впечатление и весомую причину для того чтобы отвадить меня от изучения языка.
«Го является таким же мощным, как С++» при его механизмах обобщенного программирования — явная неправда.

Внесу немножко позитива :)


Лично мне Golang понравился своим вниманием к мелочам. Каждый преподносимый здесь плюс не тянет на киллер фитчу, будь то:


  • Встроенные утилиты godoc, gofmt, go test, go generate, etc
  • Установка пакетов из любых git репозиториев
  • Распараллеливание одним ключевым словом
  • Статическая кросс-компиляция из коробки
  • WebAssembly опять же из коробки
  • Очень простые и удобные стандартные пакеты, такие как rpc или flag
  • И многое других мелочей, что сразу не приходит в голову.

По отдельности здесь нет ничего особенного. Например в других языках есть JavaDoc, PyDoc, LuaDoc и куча разных утилит к ним; Линтеров и форматоров вагон к любому языку — выбирай на вкус. Для кросс-компиляции достаточно банч пакетов через apt/yum/portage поставить, итп.


Но удобоство Golang в том, что: a) все это сразу доступно из коробки, скачал — и можно сразу работать; б) они очень удобные и продуманные; в) благодаря предыдущим пунктам, большинство пакетов используют единый подход, что сокращает зоопарк библиотек и подходов и очень сильно упрощает анализ чужого кода.


Так что в итоге: быстрый вход, быстрая разработка, быстрое развертывание. На мой взгляд, весьма хороший инструмент для всяких ботов, консольных утилит, API и не очень крупных сервисов.
Но если вы уже умеете все это делать на других языках и вам это не доставляет никаких неудобств, то, вероятно, Golang вам не нужен.

При этом в Golang нет классов (есть структуры, struct), нет поддержки наследования, что значительно упрощает изменение кода. Плюс нет исключений, аннотаций и т.п.

А это что, если не наследование?
package main

import "fmt"

type A struct {
        x int
}

func (a *A) SetX(x int) {
        a.x = x
}

type B struct {
        y int
        A
}

func (b *B) SetY(y int) {
        b.y = y
}
func (b *B) GetResult() int {
        return b.x * b.y
}
func main() {
        f := B{}
        f.SetX(2)
        f.SetY(4)
        fmt.Printf("2*4=%d\n", f.GetResult())
}
Это весьма условное «наследование». К полю можно получить доступ и так, например:
fmt.Printf("%v\n", f.A.x)

По сути это встраивание полей и методов, связанных со структурой A, в структуру B.
как бы всем троим ответить :-)
Можете привести пример наследования на C++, который не реализуется в GO?
С учетом того, что в Go это не наследование, то любой :) Но если даже считать ваш пример наследованием, то как вы реализуете protected метод или поле?
по сути, в go, если структуры в одном package, то при встраивании, их поля/методы с маленькой буквы — protected, если в разных — private. с большой — в обоих случаях public.
Это какое-то жонглирование понятиями. Попробуйте данное дело провернуть с пакетом («библиотекой»). Сможете ли вы пользователям пакета («библиотеки») предоставить protected-методы и поля? И в качестве контрольного выстрела: можете ли вы затем изменить видимость protected на public?

Суммируя, все-таки не стоит, работая с go, мыслить категориями и парадигмами иных языков. Ведя разработку на go, нужно руководствоваться философией go и только ей.
1. провернуть с «библиотекой» можно только private/public. private/public/protected можно исключительно в своём проекте «жонглировать». изменять видимость нельзя.

2. Полностью согласен.

Как минимум, вы не сможете находясь в области видимости A вызвать функции B:


type A struct { x int }

func (a *A) GetX() int {
        return a.x
}

func (a *A) Get() int {
        return a.GetX()
}

type B struct {
        y int
        A
}

func (b *B) GetX() int {
        return b.x + 1
}

func (b *B) Get() int {
        return a.Get() + b.y
}

Если вызвать b.Get(), то, очевидно, вызовется a.GetX(), а не b.GetX().
В случае с C++ достаточно сделать так:


class A {
    virtual int GetX();
}

При наследовании свойства родительского типа переходят к дочернему.
При композиции, которая в Go, происходит перекрытие свойств, который вы встраиваете в объект более высокого уровня.

Можете привести пример наследования на C++, который не реализуется в GO?


Ну, как бы, любое наследование в C++ будет ярчайшим примером того, что не реализуемо в Go… Нету в Go наследования, только композиция.

С плюсах есть virtual-семантика, например, которая в Go нереализуема в принципе.

Собственно, есть еще «фишка» с конструкторами, которые в C++ вполне наследуются, а в Go отсутствуют, что тоже «накладывает отпечаток». Т.е. «встроенное» поле структуры в Go всегда будет неинициализированным, констрактить вы его будете ручками.

Наследник в C++ скрывает детали реализации родителя, в Go — нет. Вы всегда можете «достучаться» до встроенного типа из «потомка».

Модификаторы доступа и области видимости достаточно чувствительно разнятся. В Go модификаторы доступа — уровня пакета, в плюсах — на уровне класса.

В общем, миллион вещей есть в C++, которые нельзя делать в Go. Это не хорошо и не плохо, это просто иногда нужно, а иногда не очень. Просто смешивать понятия не стоит, разные языки с очень различными парадигмами.

Композиция — это не наследование. Один из способов применения ООП, но не наследование.

А это что, если не наследование?


Встраивание, емнип.
UFO just landed and posted this here
Скажите, мне одному показалось, что в нём нет инструментов для быстрой обработки XML?
(столкнулся в процессе обучения по туториалам)
Я могу соврать, т.к. давно было. Но вот с ним проблема и возникла.
А что вы подразумеваете под «быстрой обработкой XML»?

Если «анмаршаллить из XML, маршаллить в XML» — есть, и даже в стандартной библиотеке есть.

Если вам SOAP нужен, xsd-схемы и все вот это — тогда да, ничего приличного нет, по большей части из соображений невысокой востребованности, имхо.
Да куда там. Я остановился просто на чтении/парсинге. И кажется ни одного у меня такая же проблема. github.com/golang/go/issues/21823
Ну, если так, то согласен, косяк. Но он больше к вопросу сферы применения Go. Видимо, в тех случаях, когда вам действительно нужен парсинг больших xml-файлов, Go не лучший язык для применения.
До тех пор, пока кто-нибудь не напишет подходящую библиотеку :)
Собственно, прямо в issue, на который вы ссылались, рекламировали более другую библиотеку.

Учитывая, что оно висит уже больше года, видимо, сильно не в приоритете. Так что я не стал бы серьезно рассчитывать, что в мейнстрим-библиотеках появится что-то прорывное в этой области в обозримое время. XML — вотчина серьезных бизнес-приложений, там как царила Java, так и царит до сих пор.

На go можно программировать микроконтроллеры?

Sign up to leave a comment.