Илья
ну ок, значит я вас неправильно понял. Я подумал, что вы предлагаете тупо возвращать тип, который удовлетворяет интерфейсу error
эммм, именно это я предлагаю, точнее так делают в го, и можно сделать хелперы для внешних пользователей // IsTemporary returns true if err is temporary. func IsTemporary(err error) bool { te, ok := err.(temporary) return ok && te.Temporary() }
Andrey
я про второй вариант error types
Andrey
помните, я говорил, что вызывающему каст придётся делать
Andrey
в-общем, не всё так просто
Andrey
везде downsides
Илья
если вызываещему не важно, какая ошибка произошла, ему делать ничего не нужно, если есть необходимость, вы можете сделать хелперы (пример из стандартной либы os я кидал выше), что за downsides, неясно, возвращать вы все равно будете интерфейс error, в чем у вас проблема я понял, называется nil interface, встречается не только при обработке ошибок, про это нужно знать
Антон
эммм, именно это я предлагаю, точнее так делают в го, и можно сделать хелперы для внешних пользователей // IsTemporary returns true if err is temporary. func IsTemporary(err error) bool { te, ok := err.(temporary) return ok && te.Temporary() }
И чем это хорошо? Всё равно вызывающей стороне switch делать, и опять нигде в коде не записан весь набор ошибок, которые может возвращать функция
Илья
И чем это хорошо? Всё равно вызывающей стороне switch делать, и опять нигде в коде не записан весь набор ошибок, которые может возвращать функция
это хорошо тем, что пользователь может как знать, какие ошибки ему нужно обработать, так и не знать, ему может быть не важно, и он просто остановит выполнение программы
Илья
От функции зависит
в го такого нет, и аналогов паттерн матчинга по аналогии с растом/хаскелем/ерлангом местами и правда не хватает, но жить это не мешает
Антон
в го такого нет, и аналогов паттерн матчинга по аналогии с растом/хаскелем/ерлангом местами и правда не хватает, но жить это не мешает
Ага, не мешает. Кроме того, что в любой момент может прийти ошибка, которую ваш код не знает, как обработать, и программа падает на проде
Илья
хм, все логично, если, в случае возникновения ошибки, вы не можете продолжить, и вам пришла неизвестная ошибка, которую вы не обработали, программа же должна упасть?
Andrey
в питоне с эксепшионами такая же фигня
Антон
в питоне с эксепшионами такая же фигня
А что, в питоне у исключений не корневого типа?
Andrey
есть
Илья
Проблема в том, что в Go ты в принципе не можешь быть уверен, что обработал все ошибки, не смотря в код
эмм, а в языке, где все есть, кроме HKT, ты пишешь обработчики ошибок, не смотря в код?
Andrey
полная фраза в питоне с эксепшионами ты в принципе не можешь быть уверен, что обработал все ошибки, не смотря в код
Andrey
а если смотреть, то надо прям в весь код смотреть, и в тот, что вызываешь, тоже
Andrey
получил невалидные данные, и не проверил
Антон
эмм, а в языке, где все есть, кроме HKT, ты пишешь обработчики ошибок, не смотря в код?
В языке-который-нельзя-называть функции, которые завершаются нефатальной ошибкой, возвращают Result, у которого два возможных взаимоисключающих варианта - Ok и Err. Так как этот тип обобщённый, то в варианте Err может быть любой тип, в том числе и тип, суммирующий все ошибки внутрилежащих функций
Andrey
не в курсе вашего юмора, что это за язык такой?
Илья
но жить без нее можно :)
Антон
Алексей
ну просто можно в питоне перехватить Exception, правда я бы не назвал это прям обработкой
Антон
Это выживание
Илья
Это выживание
в скольки промышленных языках реализована подобная концепция?
Алексей
отсутствие Exception'а не значит, что ошибки нет.
ну в питоне насколько я знаю кодов ошибок нет
Алексей
так что всё таки значит
Алексей
А что, даункастить исключение нельзя?
в смысле? мы вообще говорим про обработку всех исключений разом
Алексей
отсутствие Exception'а не значит, что ошибки нет.
ну только если заигнорить исключение, но тут уж ничего не поможет против такого говнокода
Ευγένιος
2018 год, люди все ещё спорят по поводу исключений в го.
Алексей
без дженериков то можно худо-бедно прожить
Ευγένιος
Сейчас все сообщество го будет или триггерится или фейспалмить.
Алексей
как выкручиваетесь?
тут только один способ: interface{}
Алексей
костыль же
ну что поделать
Andrey
так что всё таки значит
много раз видел return result, error в питоне
Алексей
много раз видел return result, error в питоне
это видимо гошники написали
Andrey
да не обязательно
Антон
в скольки промышленных языках реализована подобная концепция?
Разве что в C++ с std::variant. Но там это не самый распространённый способ обработки ошибок
Алексей
и за такое по рукам надо бить
Andrey
функция считает ошибку частью возвращаемых данных, ей не надо исключение вызывать
Илья
Разве что в C++ с std::variant. Но там это не самый распространённый способ обработки ошибок
это я к чему, в языке, который нельзя называть, есть хорошие концепции, и даже либ там уже поболее чем было раньше, но это не повод отказываться от остальных языков
Andrey
что за язык то?
Илья
ржавчина
Andrey
о
Andrey
так и думал
Alexander
руст небось
Andrey
зобаньте его, он проговррился
Andrey
и этого
Ivan
Рустика
Denis
благодарю
Илья
гошка изначально выигрывала, по моим ощущениям, более понятным синтаксисом, большой стд либой и тулингом из коробки, на чем и выехала
Алексей
функция считает ошибку частью возвращаемых данных, ей не надо исключение вызывать
ну это нормально только тогда, когда ничего страшного не случится если эту ошибку проигнорить
BRZ
в pq нет, в pgx/pgtype вроде бы есть
Я нашел решение как описать запрос в моделе если интересно вот решение db.Model(&q).Column(«name»). ColumnExpr("array_agg(id) as id»).Group(«name»).Select()
Илья
и хайпом гугла
хз, я бы сказал, что поддержка гугла помогала языку набирать стд либу, я влез в го из колбэкхелла в libev, и так и остался
BRZ
сам запрос sql SELECT name, array_agg(id) from my_tables group by name продублировал если кому то лень листать)
Алексей
хз, я бы сказал, что поддержка гугла помогала языку набирать стд либу, я влез в го из колбэкхелла в libev, и так и остался
ну по сравнению с коллбэкхеллом что угодно покажется замечательным инструментом
Алексей
Хотя на самом деле я не встречал ничего лучше чем горутины
heavycharged
кто-то юзает в данный момент chromedp + chrome headless?
heavycharged
раньше работал, сейчас что-то перестал
Slava
всем привет: у меня есть: resSl = v.ParentMs = 'dailystatusms' v.childMs = 'planningms' v.listOfCalls = '[API.GetTimesheets API.GetLastIssues API.GetLastIssues API.SpentTime API.SpentTime API.GetOpenPlannings]' v.ParentMs = 'dailystatusms' v.childMs = 'projectms' v.listOfCalls = '[API.GetProjects API.GetColleagues]' v.ParentMs = 'dailystatusms' v.childMs = 'trackerifms' v.listOfCalls = '[API.GetColleagues API.GetTotalReports]' v.ParentMs = 'planningms' v.childMs = 'trackerifms' v.listOfCalls = '[API.GetProjectIssues API.GetIssueByURL]' v.ParentMs = 'projectms' v.childMs = 'trackerifms' v.listOfCalls = '[API.GetProjectsByUser API.GetProjectsByUserTrackers]' имеем слайс структур в формате выше... Надо получить дот файл: digraph G{ ANALYTICSMS->USERMS[label="RequestUserJWT\nUpdateUser\nLoginUser"]; ANALYTICSMS->TRACKERIFMS[label="GetCurrentUser"]; DAILYSTATUSMS->USERMS[label="RequestUserJWT\nUpdateUser\nGetCurrentUser"]; DAILYSTATUSMS->TRACKERIFMS[label="GetCurrentUser"]; DAILYSTATUSMS->PROJECTMS[label="GetProjects\nGetColleagues"]; DAILYSTATUSMS->TRACKERIFMS[label="GetColleagues\nGetTotalReports"]; DAILYSTATUSMS->PLANNINGMS[label="GetTimesheets\nGetLastIssues\nSpentTime\nGetOpenPlannings"]; INVOICEMS->USERMS[label="RequestUserJWT\nRequestUsersJWT\nGetUserInfo"]; INVOICEMS->PROJECTMS[label="GetProjects\nGetUsersProjects"]; INVOICEMS->PLANNINGMS[label="GetUsersPlannings\nGetPlanningsDetails"]; PROJECTMS->TRACKERIFMS[label="GetProjectsByUser\nGetProjectsByUserTrackers"]; SCREENSHOTMS->USERMS[label="RequestUserJWT\nGetUserInfo"]; SCREENSHOTMS->PROJECTMS[label="GetProjects"]; TRACKERIFMS->USERMS[label="RequestUserJWT\nSudoCheckUsersExist"]; USERMS->TRACKERIFMS[label="FindByOAuthCode\nGetUserByOAuth\nGetUserByCredentials\nGetProjectDetails"]; PLANNINGMS->TRACKERIFMS[label="GetProjectIssues\nGetIssueByURL"]; PLANNINGMS->PROJECTMS[label="GetProjects"]; } кто работал с дот файлами для построения зависимостей, может что подскажет?
Daniel
вопрос не ясен
Daniel
генератор дот-файла вы хотите написать? или ищете готовый?
Slava
надо со слайса структур построит ьдот файцл, потом запустить его и получит ьпдф или пнг картинку
Slava
структура type DOTrecord struct{ ParentMs string childMs string listOfCalls []string } в такмо виде
Daniel
в чем проблема-то?