Pull to refresh

Comments 55

всё это здорово конечно, но вы несколько раз используете слово «класс», которых в Go нет, и смешиваете в кучу packages (суть модули) и interfaces (тип данных, как byte или string), из-за чего я не всё понял

Использование словам "класс" — это наследство от java, так как первое знакомство, он местами проскакивает. На самом деле да, тут используются структуры, что непривычно по началу.

Проблема в том, что в go привычных классов и вместо наследывания предлагают встраивание (например, тут и тут). Это позволяет некоторым, например мне, считать, что Golang больше крутой мейнстримный процедурный язык, который был нужен многим, потому что у них был только C, но подходящий для узкого круга задач.


А отсутствие шаблонных типов превращает работу там, где они нужны в мешанину из interface{}. Хотя вот в go 2.0 вроде они будут.

спасибо, Ваше мнение очень важно для нас
(хотя логично, docker на нем написан)
А docker-compose написал на python, хотя причин я не понимаю до сих пор)

Собственно первая надежда что ctop на python оттуда и зарадилась.

можно сказать что так исторически сложилось, потому что он основан на исходниках фига (http://www.fig.sh/), который до этого назывался plum.
Что лучше, Go или D? В качестве некстгена плюсов? Без гуя и с ним? В треугольнике винда-линукс-андроид?
В треугольнике винда-линукс-андроид?

Java. Вы, конечно, можете попробовать делать это на Go, но я бы не советовал. И они пока тоже.

Или можно еще попробовать Kotlin.
Как ни странно, слева понятно что происходит, а справа какая-то магия.

Ну я вот D не знаю совершенно, а код справа вполне понятен.

Вполне, ещё не значит что понятен. Go многое впитал в себя от Си и это видно по коду. D судя по тому что я вижу позаимствовал магию от Ruby и с наскока данный код не будет понятен тем кто с Ruby не сталкивался. Так что тут 2 языка со разными корнями. Но Си с как по мне более прямолинеен и последователен, как собственно и Go.

Вот только Ruby я знаю ещё меньше чем D, а код всё равно понятен. (:


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

Не знаю причем тут магия, но то что Вы видите в строке 7, называется Uniform Function Call Syntax, который позволяет писать функции не по-отдельности, а через точку, в таком случае первый аргумент функции будет являться тем объектом, к которому Вы эту функцию присовокупили (иными словами foo(a); это аналог a.foo();): https://tour.dlang.org/tour/ru/gems/uniform-function-call-syntax-ufcs


И эта особенность как раз сильно сокращает время на чтение и понимание кода. А также дает некоторые интересные возможности.

Это конечно всё круто, но то что вы описываете и есть особенности языка, в Ruby тоже самое можно сделать насколько я знаю, и периодически сталкиваясь с Ruby, знаю не понаслышке о его магических способностях. Поэтому D и напомнил мне Ruby. По синтаксису Go можно сразу сказать что тут всё прямолинейно как в Си и для тех кто сталкивался с Си (я думаю те кто учился на IT специальностях по любому с ним сталкивались) легко освоит Go ибо там всё также просто и прямолинейно.

Хочу заметить, что даже для тех кто сталкивался с Java и Python, и не сталкивался с Си, Go показался достаточно дружелюбным по дизайну.

По-моему D по своему синтаксису очень сильно похож скорее на C#, поэтому для людей которые знакомы с C# этот язык придется очень по душе и переход может быть очень легок. Но если сравнивать Go и D, как мне кажется D хорош, но относительно не популярен, литературы не так уж и много, полноценной IDE нет (понятно что кодить можно и в блокноте, но новичку на стадии изучения гораздо удобнее пользоваться подсказами самой IDE, а Go в свою очередь прост в понимании, удобен, есть прекрасная IDE Gogland от Jetbrains и в целом всё работает «из коробки», установил — и все твое время направлено на реализацию идеи (в D приходилось «шаманить», и даже сталкиваться с трудностями, например статической линковкой 32-х битных сторонних библиотек под Windows, для новичка это порой трудно и может напрочь отпугнуть). Я бы советовал смотреть в сторону Go, хотя можете на своем опыте проверить оба варианта.
D не умеет Андроид пока и не является промышленным.
Go не для GUI.
D умеет Android через LDC «Full Android support, incl. emulated TLS»
Да, похоже работы в этом направлении к чему то привели — новинка LDC 2017г.
Но выглядит пока не очень. JNI и чистый OpenGL. Ждем GUI-libs

2. Нет, генерация кода html не является GUI

А gui на вэб-формах html/css/js уже не gui? Пример реализации можно увидеть в syncthing.

сейчас GUI нередко через веб интерфейс делают, при таком Go справляется не хуже остальных имхо, еще большой плюс что есть приличное количество библиотек для организации консольного интерфейса и даже некоторые аналоги старого доброго Turbo Vision
моё мнение такое: Go — язык нишевой, он хорош для создания небольших сервисов (демонов), ориентированных на работу с сетью (в. т.ч. и веб-приложений) и консольных клиентов к ним (или просто утилит). и в этой нише он «лучший» (да, я гофер, да я уже пробовал php, python, ruby и даже perl). в «треугольнике винда-линукс-андроид» лучше D (если вы уверены, что D — некстген C++, я, например, не уверен, и брал бы плюсы, при всех их минусах)
а чем он так сильно от Java отличается что на последней можно большое, а на Go нельзя? а то я может что то не заметил
можно, можно большое, и я нигде не писал обратного, про java тоже не писал, я лишь отвечал человеку на вопрос
Что лучше, Go или D?

и подчеркнул то, в чём Go, на мой взгляд, хорош

недавно здесь на Хабре была статья про веб-приложение, кажется, на asm, но «можно» != «хорош в чём-то»
Да, они на Go, да «проекты большие», но если вы таки посмотрите на исходный код, то увидите, что 2 из 3 ваших примеров состоят из 10(!)+ небольших сервисов и клиентов к ним, хотя можно было обойтись и 2-мя. Concource — да, состоит из «всего» 4-х кусков, но это никак не опровергает мой тезис «Go хорош для небольших демонов».

2 из 3 это k8s и docker? Docker раньше был одним процессом (плюс commandline клиент), его разделили из-за необходимости масштабирования компонентов независимо друг от друга. Рантайм отдельно, управление отдельно. Благодаря такому разделению в нем теперь есть такая вещь как live restart (перезапуск управляющего демона без перезапуска контейнеров). Звучит как хорошая причина для разделения?


На тему k8s, я хотел бы услышать ваше мнение за счет чего можно сократить количество демонов. Но независимо от их числа, вы прямо так считаете тот же kubelet "небольшим"?

Большие сервисы тоже можно как показывает практика гигантов индустрии :)

Для не слишком навороченных программ под винду Go вполне себе годится благодаря github.com/lxn/walk — качественная тонкая обёртка для стандартных win api контролов в декларативном стиле.

я бы тоже взял С++, поскольку возится с не поддерживаемыми биндингами нет ни какого желания

В качестве nextget плюсов по-моему пока только Rust выступает. Все-таки у обоих D и Go есть GC. Поэтому если вам не нужна zero cost abstraction, то стоит задуматься может подойдут не компилируемые в native языки, типа Java, C# и т.д.

Не-компилируемые хотят рантайм. Например, была задачка — собрать тонкий Node.JS сервис из толстой нативной либы и засунуть в докер. Подружить этот зоопарк, чтобы собирался одной кнопкой — нетривиально, хоть и решаемо. А потом корректно проставить всё в контейнер и вычистить мусор. Куда проще скрутить и запаковать монолитный бинарь.

В качестве "некстгена плюсов" однозначно D, но к сожалению в текущей реализации на 100% плюсы он заменить не может, если конечно не писать без использования сборщика мусора. Хоть это и возможно, но все равно без GC теряются дефолтные фишки языка такие ассоциативные массивы, делегаты и т.д. (в будущем возможно будут какие-то изменения касательно отвязки библиотеки от GC). В принципе и для этих примитивов есть замена без GC, если понадобится.


Сейчас D напоминает скорее нечто среднее между C# и Java, но только не требующее никаких виртуальных машин и рантаймов, т.к. исполняемый файл можно статически слинковать со всеми необходимыми библиотеками.


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


Так что если не пишите какие-то супербыстрые сетевые сервисы, то из этих двух однозначно D (хотя для сетевых сервисов в D есть фреймворк vibe.d)

На фоне Go даже Python выглядит более совершенным. По факту в Go простоту довели до примитивизма и похерили все наработки в области разработки языков программирования за последние 50 лет.

В итоге язык больше обрубок какой-то напоминает. Про серьезные проекты на нем читать вообще смешно. Ну да. Запилили на нем REST сервис который JSON отдает. Замечательно! Просто прорыв. А что дальше? Язык не поддерживает элементарные обобщения и обработку данных на нем вести практически невозможно. В итоге кроме как JSON-ом плеваться ничего другого не остается.

В этом и смысл. Поэтому большинство любителей Golang — автоматически становятся любителями микросервисов, потому что большие монолиты на нем не напишешь. А микросервисы, без всего этого ООП и боли отлично пишутся.
Раньше, если вам нужен был микросервис, у вас был только Python или C++, не очень крутой выбор. А тут теперь и Golang докинули.

UFO just landed and posted this here
обработку данных на нем вести практически невозможно

а можно примеры, пожалуйста, не могу представить такие данные, что не обработать в Go
кроме как JSON-ом плеваться ничего другого не остается

так сейчас время такое и большинство бизнес-процессов вокруг этого построено, разве нет?
Да к примеру простое суммирование превращается в ад. Аж 40 строк. Нафига спрашивается? Со всеми остальными данными тоже самое. Приходится писать простыни. Код ради кода.

>так сейчас время такое и большинство бизнес-процессов вокруг этого построено, разве нет?
Сейчас время BigData и очень часто на сервере нужно что-то посчитать и обработать прежде чем отдать.

Я могу такой код еще 6 раз скопировать, и он будет еще больше казаться. Сравненип кода абсолютно неверное, нет использования интерфейсов, например.

UFO just landed and posted this here
Пример на скрине честно говоря из пальца высосан. int64sum очевидно покрывает все описанные там кейсы, всю ту простыню можно свести в несколько строк.

Слева у вас код дублируется аж четыре раза. Без этого ненужного дублирования код сокращается ровно до 10 строк, что не так уж и много.

И для каждого отдельного типа придется писать отдельную функцию.

нет, интерфейсы и рефлексию никто не отменял

Не отменял. Но это то же, что было в Java до 1.5.

Да к примеру простое суммирование превращается в ад. Аж 40 строк. Нафига спрашивается?

автор того сниппета с сайта dlang очевидно болен, не думаю, что здесь есть что обсуждать
Сейчас время BigData и очень часто на сервере нужно что-то посчитать и обработать прежде чем отдать

вот в этом гошечке просто нет равных ибо идеоматичный код:
1. автоматически масштабируется на любое количество доступных ядер (будь их хоть 2, хоть 64)
2. практически не блокируется
3. в принципе быстро работает: даже при одном потоке Go, в среднем, быстрее Java и NodeJS (популярный нынче выбор для бэкендов) и во много раз (до 10) быстрее Python3.
4. имеет небольшое и прогнозируемое потребление памяти
в принципе быстро работает: даже при одном потоке Go, в среднем, быстрее Java и NodeJS (популярный нынче выбор для бэкендов) и во много раз (до 10) быстрее Python3.

Есть сайт для сравнения скорости разных платформ: https://www.techempower.com/benchmarks/#section=data-r14&hw=ph&test=json
Примечательно, что если кто-то считает, что решение неэффективно — он всегда может это исправить.


Итак, судя по этому сравнению, на всех типичных задачах Go медленнее, чем Java или C++ .


Отсюда вопрос: а на каких бенчмарках Python оказался медленнее в 10 раз, чем Go? На каких бенчамарках Java оказалась медленнее, чем Go?

Сейчас время BigData и очень часто на сервере нужно что-то посчитать и обработать прежде чем отдать.

в бигдате есть явно разделённые этапы, типично это
  1. Выделение и преобразование данных
  2. Скармливание данных в хранилище (Clickhouse, Vertica, Prometheus, очередной уродец из Java-стэка для любителей вёдер с болтами и т.п.)
  3. Обработка данных средствами хранилища (какие-нибудь маркетологическеие метрики в Кликхаусе-Вертике, метрики для мониторинга в Прометеусе и т.п.)


Для выделения и преобразования данных дженерики не нужны. Для скармливания тоже. Обработка — тот же самый прометеус написан на Go. Дженерики могут быть как-то полезны только в простейших случаях.
Упрощение, разделение и микросервисы — наше всё! Для этого го и предназначен.
как язык Go достаточно банален, никаких новых концепций особо незаметно, но там есть две плюшки из-за которых данная платформа мне импонирует
1. на выходе исполняемый файл не требующий с потребителя «скачать еще сто мегабайт неведомой фигни и проинсталлировать обеспечив что бы уже не стояла неведомая фигня в путях»
2. кросс-компиляция осуществляется без плясок с бубном, всеголишь настройкой пары параметров и под линуксом вполне билдятся версии под винду и мак
Sign up to leave a comment.

Articles