Nikita
Я хочу бинарник на шаред хостинг поставить.
Nikita
У меня там доступ к шелу есть, и бинарник норм работает.
Slava
ну если работает, то пусть в себе состояние и держит
Dmitrii
я хочу открыть файл и отправить его в ответ, но при этом отхэндлить тип ошибки, если это ENOENT то 404, если другая то 500, так ок делать или нагородил лишнего? file, err := os.Open(filePath) defer file.Close() if err != nil { if err, ok := err.(*os.PathError); ok { switch err.Err.(syscall.Errno) { case syscall.ENOENT: http.Error(w, err.Error(), http.StatusNotFound) return default: http.Error(w, err.Error(), http.StatusInternalServerError) return } } http.Error(w, err.Error(), http.StatusInternalServerError) return } io.Copy(w, bufio.NewReader(file))
Илья
А в этом можно быть уверенным?
сначала проверить ошибку, после этого зарегистрировать defer
Dmitrii
а что мне отдавать если произошла не предвиденная ошибка?
Mikalai
file.Close() может вернуть ошибку
file.Close() выполнится в конце функции, а если была ошибка, то свалится в panic
Oleksii
file.Close() выполнится в конце функции, а если была ошибка, то свалится в panic
Я о том, можно ли быть уверенным, что при закрытии файла всё пройдёт без ошибок
Oleksii
А не о том, что случится, если закрывать файл с defer
Илья
а что мне отдавать если произошла не предвиденная ошибка?
вообщем switch можно упростить до if pe, ok := err.(*os.PathError); ok && pe.Error == os.EEXIST {
Oleksii
Мне кажется, что лучше всегда явно проверить, есть ли ошибка
Илья
Мне кажется, что лучше всегда явно проверить, есть ли ошибка
что ты будешь делать с ошибкой на закрытии файлового дескриптора при закрытии файла? как это может повлиять на твой функционал?
Daniel
можно паниковать, можно игнорить
Anonymous
Мне кажется, что лучше всегда явно проверить, есть ли ошибка
Можно воспользоваться функциями os.Stat(...) и os.IsNotExist(err)
Daniel
но один полезный линтер заставит вас ее обрабатывать
Dmitrii
вообщем switch можно упростить до if pe, ok := err.(*os.PathError); ok && pe.Error == os.EEXIST {
какое у этого выражение название? err.(*os.PathError) я хочу почитать про него, т.к щас это магия
Anonymous
и только потом открыть
Илья
https://tour.golang.org/methods/15
Илья
забыл уже как называется :)
Dmitrii
спасибо
Mikalai
и только потом открыть
а какой смысл, если все равно придется проверять ошибку open ?
Илья
какое у этого выражение название? err.(*os.PathError) я хочу почитать про него, т.к щас это магия
хотя, как сказали уже выше, есть шорткат для таких ошибок os.IsNotExist(err)
Dmitrii
похоже это то что я и искал
Mikalai
тогда уж можно заюзать ioutil.ReadFile(...)
так readfile же в буфер вроде читает
Mikalai
над ним io.Copy не сделаешь
Anonymous
а нужен ридер, сори
Nikita
хм, не могу найти не библиотеку для работу с вебхуками дискорда. Значит пора учиться работать с json, http?
Nikita
подскажите статью или гайд, чтоб не гуглить левое чето
dev_sheep
С json и http надо уметь с самого начала работать :)
dev_sheep
Каноны жи
Nikita
я раз, но в go tour этой темы не было
dev_sheep
А, понял
Nikita
а go tour сейчас мой ед. источник знаний. Куда дальше не совсем понятно. Либо читать блог го, либо это https://golang.org/doc/articles/wiki/
Dmitrii
os.Create по умолчанию перезаписывает файл, можно ли сделать, чтобы он возвращал ошибку если файл уже существует?
Mikalai
можно добавить O_EXCL, тогда если файл существует будет ошибка
Dmitrii
👍
Nikita
а мне подскажут че-нить?
Nikita
можно?
Oleksii
можно?
gobyexample.com
Irina
https://gowebexamples.com/
Nikita
спасибо
Nikita
https://godoc.org/github.com/robfig/cron
Nikita
не понимаю, как с этим работать?
Nikita
func main() { bot := CreateTGBot(tgBotAPI) c := cron.New() c.AddFunc("*/10 * * * * *", func() { start(bot) }) c.Start() }
Nikita
если так сделать, то приложение сразу выходит.
Nikita
если сделать for {} то 1 раз срабатывает и все
Oleksii
func main() { bot := CreateTGBot(tgBotAPI) c := cron.New() c.AddFunc("*/10 * * * * *", func() { start(bot) }) c.Start() }
Зачем тебе это, можешь же на коленке написать то же самое
Oleksii
На 10 строк
Nikita
ну я сначала сделал for { } и внутри слип каждые 10 сек
Oleksii
Можно так, можно через timer.NewTicker
Oleksii
Как уже сам захочешь
Nikita
странная штука, один раз вкл. и все
Nikita
и то в нем функция start не работает
Nikita
лан легче слиппер вкл.
Nikita
аа, я могу запустить горутину с временем и сделать select
Alexander
Есть какая нибудь либа на го, которая полностью обеспечивает user management? Аутентификация, регистрация, восстановление пароля, редактирование данных и т.п.
Alexander
может в составе фрэймворка есть готовое?
Diasko
Есть - https://github.com/mikespook/gorbac
Хорошая либа, только допиливать надо обвертку
Oleg
Хорошая либа, только допиливать надо обвертку
Сделайте PR, возможно автор примет
Diasko
Сделайте PR, возможно автор примет
к самой либе вопросов нет, мы допиливали для нее хранение ролей и действий, и привязка пользователей к ролям и получение, и т.д
Diasko
Это не допиливание, это рутина
это теперь внутрений модуль, который переходит из проекта в проект)
Oleg
Библиотека делает одну фичу хорошо. Этого достаточно для библиотки, кмк. Не обязательно вам будет удобно ей пользоваться при этом.
Anonymous
Коллеги, что используете для файлов конфигов? JSON/YAML/TOML и т.п.?
engelbart
Всё
Anonymous
Всё
А если порекомендовать один на все случаи жизни, чтобы выбрали?
Zhenja
ini
Alexander
{ "database": { "username":"root", "password":"root", "dbname":"test" }, "log": { "path":"/var/log/test" } }