В качестве альтернативы можно посмотреть на транслятор обычного Питона (а не новый язык как в случае Cython) в Си: github.com/Nuitka/Nuitka Без каких-то особых проблем на нем даже смог скомпилировать такой крупный проект как youtube-dl !
Если как self-hosted сервис, то есть Gitea. К сожалению, там нет встроенных CI/CD фич, но можно использовать для этого внешние совместимые сервисы. Для CI из этого списка мне приглянулся Woodpecker.
Го типизированный язык, данными структур и других атомарных типов компилятор может дирижировать как ему угодно, что позволяет не хранить в рантайме для них информацию о типе. Эта информация вкладывается в контейнер интерфейса при присваивании значения только во время компиляции.
Для слайсов, мап, каналов, интерфейсов оператор '==' работает над контейнером, а не над данными внутри. Нетипизированный nil присваивается в контейнер, а типизированный в данные контейнера. Чтобы узнать что в данных значение nil нужно преобразовать интерфейс сначала в этот тип, затем проверить на nil, либо через рефлексию получить сырой указатель и уже работать с ним. Пример: https://go.dev/play/p/LHO6WsI9hY_R
Еще есть https://github.com/ory/dockertest для тех же целей.
Не самый лучший пример использования интерфейсов в Go. Делайте интерфейсы максимально узкими по назначению.
Как это используется в реальной жизни
В качестве альтернативы можно посмотреть на транслятор обычного Питона (а не новый язык как в случае Cython) в Си: github.com/Nuitka/Nuitka
Без каких-то особых проблем на нем даже смог скомпилировать такой крупный проект как youtube-dl !
Если как self-hosted сервис, то есть Gitea. К сожалению, там нет встроенных CI/CD фич, но можно использовать для этого внешние совместимые сервисы.
Для CI из этого списка мне приглянулся Woodpecker.
Го типизированный язык, данными структур и других атомарных типов компилятор может дирижировать как ему угодно, что позволяет не хранить в рантайме для них информацию о типе. Эта информация вкладывается в контейнер интерфейса при присваивании значения только во время компиляции.
Для слайсов, мап, каналов, интерфейсов оператор '==' работает над контейнером, а не над данными внутри.
Нетипизированный nil присваивается в контейнер, а типизированный в данные контейнера.
Чтобы узнать что в данных значение nil нужно преобразовать интерфейс сначала в этот тип, затем проверить на nil, либо через рефлексию получить сырой указатель и уже работать с ним.
Пример: https://go.dev/play/p/LHO6WsI9hY_R
Для этого уже есть errgroup. Решает те же задачи, но в более идиоматичном для Go виде.