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))
Mikalai
я хочу открыть файл и отправить его в ответ, но при этом отхэндлить тип ошибки, если это 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 file.Close() нужно делать только если нет ошибки
Oleksii
Илья
я хочу открыть файл и отправить его в ответ, но при этом отхэндлить тип ошибки, если это 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))
зачем там switch? если default совпадает с продолжением?
Oleksii
Mike
я хочу открыть файл и отправить его в ответ, но при этом отхэндлить тип ошибки, если это 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))
а зачем ты хочешь 500 отдавать? не надо так
Dmitrii
а что мне отдавать если произошла не предвиденная ошибка?
Oleksii
А не о том, что случится, если закрывать файл с defer
Oleksii
Мне кажется, что лучше всегда явно проверить, есть ли ошибка
Daniel
можно паниковать, можно игнорить
Mikalai
Daniel
но один полезный линтер заставит вас ее обрабатывать
Dmitrii
Anonymous
и только потом открыть
Илья
Илья
https://tour.golang.org/methods/15
Илья
забыл уже как называется :)
Dmitrii
спасибо
Илья
Dmitrii
похоже это то что я и искал
Anonymous
Mikalai
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
Mikalai
можно добавить O_EXCL, тогда если файл существует будет ошибка
Dmitrii
👍
Nikita
а мне подскажут че-нить?
Nikita
можно?
Oleksii
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
Oleksii
На 10 строк
Nikita
ну я сначала сделал for { } и внутри слип каждые 10 сек
Oleksii
Можно так, можно через timer.NewTicker
Oleksii
Как уже сам захочешь
Nikita
странная штука, один раз вкл. и все
Nikita
и то в нем функция start не работает
Nikita
лан легче слиппер вкл.
Nikita
аа, я могу запустить горутину с временем и сделать select
Alexander
Есть какая нибудь либа на го, которая полностью обеспечивает user management? Аутентификация, регистрация, восстановление пароля, редактирование данных и т.п.
Alexander
может в составе фрэймворка есть готовое?
Diasko
Oleg
Oleg
Oleg
Библиотека делает одну фичу хорошо. Этого достаточно для библиотки, кмк. Не обязательно вам будет удобно ей пользоваться при этом.
Anonymous
Коллеги, что используете для файлов конфигов? JSON/YAML/TOML и т.п.?
engelbart
Всё
Ilya
Anonymous
Всё
А если порекомендовать один на все случаи жизни, чтобы выбрали?
Zhenja
ini
Alexander
{
"database": {
"username":"root",
"password":"root",
"dbname":"test"
},
"log": {
"path":"/var/log/test"
}
}