LINUX.ORG.RU
ФорумTalks

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

 , ,


0

1

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

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

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

★★★★
Ответ на: комментарий от Im_not_a_robot

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

По тому какие продукты они создали?

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

Системщина с GC? С каких пор?

Сделали же прототип ядра OS на Go. Язык умеет работать с памятью на низком уровне, при желании можно писать на Go-ассемблере.

label:
	MOVW $0, R1
	JMP label
hbee ★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Cgo же. Пишешь перед импортами что-то вроде:

// #cgo CFLAGS: -g -Wall
// #include <stdlib.h>
// ...
import "C"

А потом вызываешь C-функции (при желании заказывая освобождение памяти при помощи defer):

name := C.CString("linux.org.ru")
defer C.free(unsafe.Pointer(name))
ptr := C.malloc(C.sizeof_char * 1024)
defer C.free(unsafe.Pointer(ptr))
hbee ★★★★
() автор топика
Ответ на: комментарий от hbee

Разве unsafe убирает всю Гошную машинерию связанную с FFI? Можно этот указатель между рутинами перебрасывать?

Просто если загуглить «cgo performance», там тонне тем о том, что всё очень плохо.

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

Лол ))) Спасибо за ссылку, не знал что такое есть. Но всё-таки там от докера (даже образца 2015 года, когда был последний коммит в репу по ссылке) - очень небольшой функционал представлен, я бы даже сказал - крошечный. Так что эту поделку едва-ли можно назвать рабочей.

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

Предположим ты пишешь либу в которой что то делается с БД.

Она используется в GUI приложении. В консольном и на сервере.

Предположим у тебя БД не коннектится.

В GUI ты должен показать юзеру диалогбокс и при кнопке реконнект повторить все.

В консольной вывести сообщение с ес но.

Серверное должно упасть записав в лог.

Как это сделать БЕЗ исключений?

Еще вопрос ты написал, что ты уверен, что ВСЕ исключения обработаны.

Расскажи как ты обрабатываешь MemoryError или NoDiskSpace.

И еще если в рантайме потоков столько сколько и ядер, то я так понял у тебя на компьютере больше НИЧЕГО не запущено? Или они святым духом питаются?

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

при неиспользуемых переменных, или импортах

Почему вы не используете GoFmt и GoImports? В любом мало-мальски популярном редакторе (например vim или vscode) есть плагины для Go, которые уберут ненужные импорты и подсветят неиспользуемые переменные.

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

Как это сделать БЕЗ исключений?

В нормальных языках можно использовать Either.

Ещё есть всякие вариации с моноидом в левой части для аккумуляции ошибок.

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

Разве unsafe убирает всю Гошную машинерию связанную с FFI? Можно этот указатель между рутинами перебрасывать?

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

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

Просто если загуглить «cgo performance», там тонне тем о том, что всё очень плохо.

Ну да, есть заметный оверхед, вызванный тем, что C-код исполняется в отдельном потоке (для исключения интерференции с горутинами). Здравый смысл подсказывает минимизировать вызовы cgo. Если нужна низкоуровневая функциональность на C, обернуть её в API, функции которого вызывать.

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

Вы только что писали, что его нет.

Значит, ошибся. Когда сам игрался с cgo, не заметил тормозов. Бенчмарков и сравнений не делал, да. И какой вывод? Go не подходит для системных задач? Подходит, просто не для всех. А когда ядро будет на Go, будет подходить для всех.

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

Go не подходит для системных задач?

Если нужно активное общение с сишными либами - нет.

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

Тоесть если библиотека использует библиотеку в которой может быть СВОЕ значение ошибки, то я буду использовать уже 2 проверки? А если в одном случае мне нужно загасить это в 1 месте, а что то в другом? Чушь какая, то. В итоге на верху меня будет лететь 10000 разных возвратных кодов (интерфейсов)

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

Ещё есть всякие вариации с моноидом в левой части для аккумуляции ошибок.

Во!!!

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

А если я профукал проверку, то не упадет? Нафиг такое (а я видел код на го который странно себя повел, а все в том, что проверку профукали... Выглядело так, что она есть)

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

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

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

Если что-то нельзя полезно обработать в месте возникновения, ошибка передаётся наверх по стеку

притягивая за собой портянку из if на каждый чих

В случае нехватки памяти дело, вероятно, кончится паникой (впрочем, не проверял).

чем паника лучше глобального try-catch?

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

В GUI ты должен показать юзеру диалогбокс и при кнопке реконнект повторить все.
В консольной вывести сообщение с ес но.
Серверное должно упасть записав в лог.
Как это сделать БЕЗ исключений?

Вопрос относится ко всем трём случаям?

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

а кто обещал, что погромировать будет легко

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

Зато есть уверенность, что обработаны все ошибки

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

Правильный (по крайней мере более правильный) подход - это монады типа Try в Scala или Result в Rust, но этого никогда не будет в Go.

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

Предположим ты пишешь либу в которой что то делается с БД

Для разработки либ Go вообще крайне плохо подходит. Очень уж он невыразительный для этого.

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

можешь возвращать результирующий объект со своей ошибкой, а можешь просто бросить исключение

Зачем давать выбор делать плохое (с точки зрения создателя языка)? Go — язык со своей философией; если нужны исключения, выбираешь язык с исключениями, всё просто.

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

Вот именно. Я выбор хочу иметь. А тут даже dll не сделать

Если давать всё, что кто-то хочет, получится C++30 :).

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

притягивая за собой портянку из if на каждый чих

Это идиоматический Go. Не нравится — есть широкий выбор других языков.

чем паника лучше глобального try-catch?

Тем, что это исключительная ситуация, а не просто ошибка логики. Значит, обрабатывать её бессмысленно. Let it crash.

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

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

Проигнорировать ошибку невозможно: линтер не позволит, IDE подсветит поганеньким цветом :).

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

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

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

Монады реализуемы везде, где есть дженерики. В Rust типы Option, Result и прочие подобные реализуют все естественные преобразования, нужные для монад. Чего там нет, так это do/for-нотации, но её отсутствие не делает монады не-монадами.

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

Проигнорировать ошибку невозможно: линтер не позволит, IDE подсветит поганеньким цветом :).

А если написать пустой обработчик?

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

А если написать пустой обработчик?

Это можно. А ещё можно поделить на ноль, если тебе это нужно.

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

Это и называется «обработать сложнее, чем проигнорировать».

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

Это идиоматический Go. Не нравится — есть широкий выбор других языков.

Вот потому Го и такое Г.

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