LINUX.ORG.RU
ФорумTalks

Я расслаблен, когда занимаюсь кодингом на Go

 , ,


0

1

На реддите появилась забавная заметка с таким заглавием: «Coding in golang relaxes me».

А и в самом деле. Нет чувства, что ты борешься с языком, ты просто «выращиваешь» решение задачи. Go помогает в решении, ориентируя мысль сразу в нужном направлении. Он поощряет маленькие функции, даёт свободу в структурировании файлов проекта (не дай божок в Питоне создать файл с таким же именем, как модуль в stdlib! Или в Джаве каждый класс, сучара, должен жить обязательно в отдельном файле!). Казалось бы, это всё мелочи, но в итоге разработка на Go оказывается весьма приятным и «отдыхательным» занятием.

Конкурентность тоже привносит много просветления. Она даётся настолько просто и естественно, что почти все решения становятся необыкновенно простыми в сравнении с традиционными многопоточными техниками.

★★★★

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

Deleted ()

Уродская система исключений (даже checked exceptions в джаве приятнее) и ошибки компиляции там, где другие выдают варнинги - например, при неиспользуемых переменных, или импортах.
Может, сейчас что-то и поменялось, но эта их система «Ты либо пишешь сразу, либо не пишешь совсем» отвратила от языка надолго.

Из приятных «хипстерских» языков - котлин.

GblGbl ★★★★★ ()
Ответ на: комментарий от GblGbl

А я боялся, что из-за отсутствия анонимусов вброс не удастся :).

Умные люди давно поняли, что исключения оказались страшным злом. Просто пока большинство боится заявить об этом во всеуслышание — ведь придётся признать, что большую часть языков надо просто выбросить. :)

Неиспользуемые переменные и импорты — неряшество, такому не место в проекте.

hbee ★★★★ ()
Ответ на: комментарий от hbee

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

GblGbl ★★★★★ ()
Последнее исправление: GblGbl (всего исправлений: 1 )

man Эффект ореола.

Похоже на то, что у тебя есть ряд причин любить язык(например - ты его знаешь и получаешь деньги) и ты начинаешь(ну или чувак на реддите, а ты это сюда притащил) не просто говорить «Это такой инструмент, с которым я работаю, у него есть такие плюсы и минусы» а «Это инструмент он как божественный, и красивый, добрый, милый, вкусно готовит, внимательный...» и так далее, штуки, которые сильно ортогональны языку. Расслабленность это больше показатель, является ли сложным участок кода или текущее настроение и другие рандомные переменные.

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

Потом начинается аффективная смертельная спираль и ты начинаешь говорить, что все остальные языки плохие, ведь $причины, но если в твоём $tool-name есть проблемы, то это обязательно неправда и вообще неважно, ведь из простого инструмента с плюсами и минусами нужно непременно лепить серебряную пулю, которая лечит рак и расслабляет программистов.

Lilly ()

Конкурентность тоже привносит много просветления. Она даётся настолько просто и естественно, что почти все решения становятся необыкновенно простыми в сравнении с традиционными многопоточными техниками.

Очень любопытно. Можно один-два gist-а строк по 50, которые показывали бы мощь и удобство?

Lilly ()

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

Deleted ()

в Джаве каждый класс, сучара, должен жить обязательно в отдельном файле

кто-то не знает джаву

не дай божок в Питоне создать файл с таким же именем, как модуль в stdlib

и хитрости питона тоже

Обе практики - говнокодинг. Есть подозрения по поводу качества Go портянок.

InterVi ★★★★ ()

Или в Джаве каждый класс, сучара, должен жить обязательно в отдельном файле!

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

ox55ff ★★★★★ ()
Ответ на: комментарий от crypt

а что должно быть вместо исключений?

Обработка ошибки в месте её возникновения. С исключениями так тоже можно, но на практике это приводит к такому чудовищному многословию (блоки try-catch на каждый вызов), которое далеко превзойдёт пресловутое гошное if err != nil. Поэтому народ ленится, оборачивает большие блоки логики в один try и в catch тупо логирует ошибку, надеясь разобраться потом :).

hbee ★★★★ ()
Ответ на: комментарий от hbee

Обработка ошибки в месте её возникновения

Ты просто не различаешь ошибки и исключения. Если ошибка, то пробуешь уйти на другое ветвление. Например, можно повторить операцию. Обычно решается возвращением «пустого» значения, либо используется специальное API. Если ошибки сложные, то можно вернуть Enum и там уже разбираться куда уйти.

Если исключение, то зачастую нужно просто завершить текущий поток, зарепортить в логи. Либо прервать операцию (опять же завершить текущий поток) и уведомить пользователя.

Нормальные языки (например, Java) умеют оба варианта, другие поделия пытаются замести под ковёр неумение в исключения. Ну и пёс с ними...

foror ★★★★ ()

А я расслаблен, когда поддерживаю и рефакторю проект на Java. Но хипстота этого никогда не поймёт, ибо:

1. Start Up
2. Cash In
3. Sell Out
4. Bro Down

Судя по всему Go для этого идеален.

foror ★★★★ ()
Последнее исправление: foror (всего исправлений: 1 )
Ответ на: комментарий от Leupold_cat

Зато уже два раза спросили не обосрался ли расслабленный программист.

mandala ★★★★ ()

А я после питона дико кайфую от няшной растишчеки.

Pacmu3ka ()
Ответ на: комментарий от hbee

Умные люди давно поняли, что исключения оказались страшным злом.

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

Manhunt ★★★★★ ()
Ответ на: комментарий от Leupold_cat

Странно. Пишут про свободу в программировании и ни слова про Perl.

У большинства людей свобода не вызывает ассоциаций с копрофагией. Потому и ни слова.

Manhunt ★★★★★ ()
Ответ на: комментарий от hbee

Разве оно не работает так в любом языке, где есть channels и многопоточность? Вот практически идентичный код на Perl 6, правда я использовал supplies, которые позволяют закрывать подписки воркеров тогда, когда источник закрывается, а не менее гибкую итерацию до ста с Channel.receive:

sub MAIN() {
    my $jobs = Channel.new;
    my $results = Channel.new;

    for ^4 {
        start worker($jobs, $results);
    }

    $jobs.send($_) for ^100;
    $jobs.close;

    react whenever $results.Supply -> $result {
        say $result;
    }
}

sub worker($jobs, $results) {
    react whenever $jobs.Supply -> $job {
        $results.send: fib($job);
        LAST { $results.close }
    }
}

sub fib($n) {
    return 1 if $n <= 1;
    return fib($n - 1) + fib($n - 2);
}

Структуру исходного примера не менял. Это тоже элегантно?

А вот идиоматический код на этом же Perl 6:

sub fib($n) {
    return 1 if $n <= 1;
    return fib($n - 1) + fib($n - 2);
}

# Числа от нуля до 100...
my @jobs = 0..100;
# Вызываем map, который для для каждого числа из последовательности вызывает fib.
# Вызов race создаёт и управляет пул воркеров:
# параметр degree позволяет задавать, сколько будет воркеров
# без него рантайм сам определит, сколько воркеров оптимально для этой задачи
# batch задаёт, сколько элементов мы хотим отдавать одному воркеру за раз
my $results = @jobs.race(batch => 1, degree => 4).map({ fib($_) });

# делаем из последовательности результирующих значений
# Supply, который позволяет нам асинхронно стримить
# значения, каждое печатаем до тех пор, пока
# пока они не закончатся
react whenever $results.Supply -> $result {
    $result.say;
}

Который делает тоже самое, по сути, с помощью map на списке, в который обработку воркерами можно добавить одним вызовом(race). Не нужно париться с ручным закрытием каналов, знанием, сколько придёт значений, и подобной рутиной. Это элегантно?

Lilly ()
Ответ на: комментарий от RazrFalcon

Кодить постоянные if err != nil действительно расслабляет.

В 1.14 собираются добавить функцию try для ленивых (что , конечно, подняло бурю в сообществе). Вместо

file, err := os.Open("/etc/passwd")
if err != nil {
    return errors.Wrap(err, "what the fuck")
}

будет

file := try( os.Open("/etc/passwd"), "what the fuck" )

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

hbee ★★★★ ()
Ответ на: комментарий от foror

Ты просто не различаешь ошибки и исключения

Исключениями в Go заведует panic и recover.

hbee ★★★★ ()
Ответ на: комментарий от Manhunt

А как в го предлагается исключительные ситуации обрабатывать без исключений?

В идеале никак. Исключительная ситуация есть серьёзная ошибка, прерывающая программу либо сессию (если речь о серверной логике). Предусмотрена обработка исключений при помощи функции recover для тех случаев, когда она всё-таки нужна.

hbee ★★★★ ()
Ответ на: комментарий от Lilly

Похоже на то, что у тебя есть ряд причин любить язык

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

WitcherGeralt ★★ ()
Ответ на: комментарий от WitcherGeralt

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

Ну и говно.

Вляпался?

Deleted ()
Ответ на: комментарий от ya-betmen

Как мне в го создать тред?

Напрямую никак. Go намеренно скрывает столь низкоуровневые детали. Рантайм создаёт пул потоков и распределяет по ним горутины при помощи собственного планировщика.

hbee ★★★★ ()
Ответ на: комментарий от hbee

А как в го предлагается исключительные ситуации обрабатывать без исключений?

В идеале никак. Исключительная ситуация есть серьёзная ошибка

Ок, ясно. Предлагается лепить такой же как в си-шке бойлерплейт и лапшу. https://www.youtube.com/watch?v=6N4RK9uyEQI

Manhunt ★★★★★ ()
Ответ на: комментарий от WitcherGeralt

Так давно бурлит тема обработки в Go 2.0

Тема check и handle уже отбурлила — отказались от этой идеи. Решили сделать нечто попроще и пораньше, без потери обратной совместимости. Но реакция сообщества такова, что могут отказаться и от try.

Меня несколько беспокоит другое: пакет xerrors примут в 1.13 в стандартную библиотеку. Мне он нравится меньше, чем pkg/errors с его Wrap, WithStack и WithMessage. Вместо этого предлагают оборачивать ошибки функцией Errorf(«%w»), что выглядит не так чисто.

hbee ★★★★ ()
Ответ на: комментарий от ya-betmen

Вот я и об этом.

Запустил горутину — она будет выполняться в другом потоке, который так или иначе был создан. В чём проблема? Как говорится, шашечки или ехать?

hbee ★★★★ ()
Ответ на: комментарий от Lilly

Это элегантно?

Нет. Всё портит синтаксис, который не даёт Перлу право называться современным языком. Рюшечки уже не носят.

hbee ★★★★ ()
Ответ на: комментарий от hbee

Нет. Всё портит синтаксис, который не даёт Перлу право называться современным языком.

Ты наверное про Go хотел написать?

Deleted ()
Ответ на: комментарий от Deleted

Ты наверное про Go хотел написать?

Go как раз имеет максимально чистый синтаксис, насколько это вообще возможно для C-подобного языка.

hbee ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.