структуру внедряете? или трейт?
Шанс того, что в процессе работы над проектом сменится бд - стремится к 0, поэтому мы юзаем хардкод на конкретную базу (хотя у sqlx и выбор не велик, oracle, к сожалению, не поддерживается)
а что за проект у вас, где используетсяя раст? а не какой ни буть go или java или js
Банк, нужно быстро и безопасно
Жалко mentat помер
а время разработки страдает иногда?
А что это? Не гуглится просто
Бывает, но окупается большой гибкостью и бОльшим перформансом. Сам пришел из го, где я страдал из-за нехватки всего. Хотя, конечно, иногда хочется все бросить и накидать простейший код на го, вместо борьбы с компилятором)
нехватка "всего" это что?)
Отвратная обработка ошибок в виде 3/4 всех строк кода это if err != nil {...} Отсутствие дженериков (самая большая боль), а как следствие всяких удобных option, result, универсальных функций, мьютексов (которые не забудешь) и тд. Отсутствие enum'ов, даже примитивных как в си, вместо этого константы юзаются Отсутствие паттернматчинга Отсутствие макросов (спорно, но растовые мне очень упрощают жизнь) Наличие nil Неявные интерфейсы с отсутствием решения пересечения названий методов Неудобные модули (во всяком случае я начинал до 1.11, сейчас лучше, но все равно привязка к url'у меня бесит) Нет unbound канала, который не буферизированный, но и не блокирующий Громоздкие лямбды Неявный захват по ссылке в лямбдах и возможности отстрелить себе ногу при спауне горутин (можно конечно просто так не делать, но никто не запрещает) Туплы очень простые, не дающие писать удобный однострочный код Нельзя вернуть переменную из {}, приходится создавать переменную блоком выше и не забыть внутри ее везде использовать Отсутствие деструктуров, а следствие неудобный во много defer, который нельзя объявить для скоупа, а не для функции Может что-то ещё, но я уже не помню
да, нормальный такой список.. у меня уже по ходу проф деформация, я многого просто не замечаю) вот по поводу обработки ошибок мне сейчас пришлось таку от штуку делать match q { Ok(q) => { self.lang_cache.insert(lang.to_string(), q.id); return Ok(q.id); } Err(e) => match e { sqlx::Error::RowNotFound => { let exec_result = sqlx::query!("insert into langs(lang) values($1)", lang) .execute(&self.db) .await; .... } _ => { return Err(Box::new(e)); } }, } как сделать обработку ошибок проще?
+ с т.з. HPC бесит GC который много кушает и заставляет городить спец. структуры данных с фиксированным числом указателей
мне не приходилось работать с такой нагрузкой где GC уже напрягает...
Ну как минимум можно убрать одну вложенность матча и написать сразу Err(sqlx::Error::RowNotFound) => {...} other => return Err(Box::new(other))
ооо, полезный совет, спасибо!
Плюс я лично мало юзаю функциональный подход для футур, но думаю есть адаптеры для написания чейнов таких, но я не подскажу, мне проще такой явный писать
Обсуждают сегодня