Igor
возможно, я саму задачу неверно решаю. Мне в запросе нужно ловить аутентификационный токен и сами данные запроса. На группу адресов я назначил мидлвер и там ловлю аутентификационный токен, и если он подходит, то данные должны идти дальше в хендлер. Логично же?
Bohdan
разве что обычно просят пройти go tour перед вопросом
last seen recently 🇹🇼
тут задвайте
Как лучше начать изучение Go? Сразу с фреймворка или самому писать свои миддлвари, орм и т.д.?
🏁Александр
с изучения стандартных пакетов
🏁Александр
фрейворки у нас не жалуют
Kirill
ну а зачем там middleware придуманы тогда?
чтобы галочку в ридми поставить можно было
🏁Александр
... и прохождения туториала
Kirill
фрейворки у нас не жалуют
пришел человек, что в $GOPATH/src всё разрабатывает ;p
🏁Александр
прямо в корне?
last seen recently 🇹🇼
то есть по сути Go по типу микрофреймворка? В стандартном пакете есть все для веба -> дальше сам крафтишь свой апп? Почти как Flask в питоне, так?
last seen recently 🇹🇼
понял, спасибо
Roman
существует уже кодо-анализатор который способен относительно экспортируемых символов пакета вычислять semver версию? допустим в новом комите я изменил интерфейс пакета, переименовал экспортируемую функцию: было: package mypack // ParseText parses texts from a file func ParseText(file string) error { /*...*/ } стало: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } очевидно я поломал обратную совместимость, поэтому анализ должен это распознать и присвоить моему комиту версию 2.0.0 однако если я не поломал совместимость в комите: было: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } стало: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } // CreateFile creates a new file func CreateFile() error { /*...*/ } т.е. например добавил новую функцию, тогда он считает feature version v2.1.0 а если я ничего не ломал но и ничего не добавлял но изменил что-то в недрах - то v2.1.1 думаю такая автоматизация версионирования была бы очень полезна
Bohdan
существует уже кодо-анализатор который способен относительно экспортируемых символов пакета вычислять semver версию? допустим в новом комите я изменил интерфейс пакета, переименовал экспортируемую функцию: было: package mypack // ParseText parses texts from a file func ParseText(file string) error { /*...*/ } стало: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } очевидно я поломал обратную совместимость, поэтому анализ должен это распознать и присвоить моему комиту версию 2.0.0 однако если я не поломал совместимость в комите: было: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } стало: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } // CreateFile creates a new file func CreateFile() error { /*...*/ } т.е. например добавил новую функцию, тогда он считает feature version v2.1.0 а если я ничего не ломал но и ничего не добавлял но изменил что-то в недрах - то v2.1.1 думаю такая автоматизация версионирования была бы очень полезна
интересный концепт штук таких не видел, но идею себе схоронил - даже написать proof-of-concept был бы интересно
Artem
существует уже кодо-анализатор который способен относительно экспортируемых символов пакета вычислять semver версию? допустим в новом комите я изменил интерфейс пакета, переименовал экспортируемую функцию: было: package mypack // ParseText parses texts from a file func ParseText(file string) error { /*...*/ } стало: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } очевидно я поломал обратную совместимость, поэтому анализ должен это распознать и присвоить моему комиту версию 2.0.0 однако если я не поломал совместимость в комите: было: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } стало: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } // CreateFile creates a new file func CreateFile() error { /*...*/ } т.е. например добавил новую функцию, тогда он считает feature version v2.1.0 а если я ничего не ломал но и ничего не добавлял но изменил что-то в недрах - то v2.1.1 думаю такая автоматизация версионирования была бы очень полезна
Если б такая штука была, семвер можно было бы на помойку выкинуть Тем более, функции внутри себя могут быть изменены, ломая совместимость, что не отразится на интерфейсе пакета
Roman
Если б такая штука была, семвер можно было бы на помойку выкинуть Тем более, функции внутри себя могут быть изменены, ломая совместимость, что не отразится на интерфейсе пакета
нененене, ясное дело что можно поломать совместимость поломав поведение функции. Но я скорее говорю про облегчение стандартного workflow разработчика Go а не про охоту на баги. Если уж ты назвал функцию CreateFile то она конечно должна создать файл, если она этого не сделает то мы получим баг. Данный анализ не сможет защитить от багов! Он сможет лишь значительно облегчить CI/CD, тебе не нужно мануально выкатывать версии с CHANGELOG'ом и всё ручками писать.. сервис с каждым комитом track'ит версию и по нажатию кнопочки можно получить release + semver версию + changelog
Roman
изменение в интерфейсе пакета: major increment (compatibility) добавление в интерфейс пакета: minor increment (feature) внутренние изменения: patch increment (bug fix / improvement)
Roman
commit message может быть использован в качестве пункта в CHANGELOG'е дополнительно к автоматически сгенерированному пункту по поводу того что изменилось и как
саша
существует уже кодо-анализатор который способен относительно экспортируемых символов пакета вычислять semver версию? допустим в новом комите я изменил интерфейс пакета, переименовал экспортируемую функцию: было: package mypack // ParseText parses texts from a file func ParseText(file string) error { /*...*/ } стало: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } очевидно я поломал обратную совместимость, поэтому анализ должен это распознать и присвоить моему комиту версию 2.0.0 однако если я не поломал совместимость в комите: было: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } стало: package mypack // ParseFile parses texts from a file func ParseFile(file string) error { /*...*/ } // CreateFile creates a new file func CreateFile() error { /*...*/ } т.е. например добавил новую функцию, тогда он считает feature version v2.1.0 а если я ничего не ломал но и ничего не добавлял но изменил что-то в недрах - то v2.1.1 думаю такая автоматизация версионирования была бы очень полезна
для руста подобное видел
Roman
для руста подобное видел
хотелось бы видить что-то подобное для Go, поскольку Go это рай для статик-анализа)
саша
хотелось бы видить что-то подобное для Go, поскольку Go это рай для статик-анализа)
> Go > рай для статик-анализа Оо. Ты о том, что это го это рай для компаний производящих проприетарные решения для статик-анализа? Ну всё же цпп ему ен переплюнуть.
Roman
https://forum.golangbridge.org/t/go-1-2-immutability-proposal/10613
саша
https://forum.golangbridge.org/t/go-1-2-immutability-proposal/10613
ща Роб Пайк выйдет и надёт вам по жопам, ишь блжад, иммутабельности захотели, в его годы они даже такого слова не знали, а тут молодёжь совсем распоясалась
саша
раньше было лучше (с) во времена ассамблера не говнокодили (с)
Кстати, handle err это же точь в точь калька с сишного способа обработки ошибок с помощью goto, не?
Daniel
Еще как.
last seen recently 🇹🇼
Ребят, я как понял в Go горутины - самые обычные корутины, только с implicit event loop'ом?
Алексей
Ребят, я как понял в Go горутины - самые обычные корутины, только с implicit event loop'ом?
Не совсем. Корутины предполагают кооперативную многозадачность, чего горутины не гарантируют.
Алексей
Чёт я походу не особо подумал. Потому что корутины могут и на нескольких потоках крутиться
Алексей
и там не совсем кооперативная многозадачность получается
Алексей
Но к примеру в ноде, корутина не прерывается пока не встретилось слово await.
Алексей
То есть корутина сама фактически должна отдать управление другим корутинам, что собственно и есть кооперативная многозадачность
Daniel
Многозадачность бывает кооперативная и вытесняющая. Горутины - кооперативная
Алексей
хм
Roman
Но к примеру в ноде, корутина не прерывается пока не встретилось слово await.
node это event loop go это как потоки, только легковесные и кооперативные. у них user space scheduler который работает на пуле системных потоков
Алексей
А как тогда асинхроннщина разруливается?
Алексей
user space scheduler
И в чем его принципиальное отличие от event loop поверх тред пулла?
Roman
И в чем его принципиальное отличие от event loop поверх тред пулла?
в event loop'е логика однопопоточная, читайте
Алексей
Так, я чувствую мне лучше в исходники залезть, а не такие специфичные вопросы задавать
Daniel
А разве в го нет event loop какого-нибудь?
Есть, для IO Горутины с ним связаны через все тот же шедулер
Pawel
какие еще варианты есть? огласите весь список, пожалуйста
Проще всего делать json-rpc поверх gorilla websocket
Alexander
какие еще варианты есть? огласите весь список, пожалуйста
Еще есть https://github.com/centrifugal/centrifuge - но может быть слишком перегруженной для простого юзкейса. Скорее нужно смотреть если нужно масштабирование PUB/SUB из коробки и не хочется городить свое решение. Плюс не так много свободы в плане выбора протокола - JSON или Protobuf. Но в целом позволяет передавать асинхронные сообщения, RPC и еще многие вещи.
Pawel
Проще всего делать json-rpc поверх gorilla websocket
плюс json-rpc - унификация. На стороне бекенда на Го - стандартный json-rpc клиент и сервер, нужно только подсунуть ему имплиментацию на вебсокетах.
Anonymous
Ребят, посоветуйте ORM (нужно чтобы firebird поддерживало, или какое либо универсальное решение)
Pawel
нормальная ОРМ только одна - reform. Но в огнептицу она не умеет к сожалению
Anonymous
Sql boiler?
это на сколько я понял универсальное решение?
Pawel
gorm? а про него что скажите
если что-то пойдёт не так (а оно пойдёт), то разобраться в чём проблема будут очень и очень трудно
Sergey
Да
Anonymous
Ну впринципе
Note: SQLBoiler supports out of band driver support so you can make your own We are seeking contributors for other database engines. эээ... то есть он сможет работать со сторонним к примеру https://github.com/nakagami/firebirdsql драйвером?
Sergey
Хммммм, неа
Pawel
Sql boiler?
не умеет в огнептицу
Anonymous
похоже придется пользоваться gorm
Pawel
похоже придется пользоваться gorm
а без ОРМ ни как нельзя? я вон для огнептицы юзаю sqlx. в принципе проблем нет
Anonymous
а без ОРМ ни как нельзя? я вон для огнептицы юзаю sqlx. в принципе проблем нет
будем думать, только начинаем проект (над старой базой)
Anonymous
Он хорош
угу, тоже смотрю
Pawel
концептуально sqlx не позволяет разве что запросы с динамической структурой билдить. Для этого есть squirrel
Anonymous
../utill
Aleksandr
не используй относительный импорт. всегда абсолютный от корня проекта myproject/util (исправил)
Anonymous
в лучше правильные пути сразу используй ~/go/src/user/github.com/project/utill
Anonymous
если ты не видишь разницы между ./utill и ../utill у тебя большие проблемы с матчастью
Anonymous
../ значит ниже на один каталог...
Anonymous
./ текущий каталог