Как стать автором
Обновить
278.41

Веб-разработка *

Делаем веб лучше

Сначала показывать
Порог рейтинга

Совет по Joomla: использование методов плагинов в любом месте Joomla 4 / Joomla 5.

Нередко расширения Joomla в готовом виде состоят из пакета - комплекта плагинов, модулей, библиотек. Расширения из одного пакета могут нуждаться в одном и том же методе. В Joomla 4 и старше новая (хм-м, 2 года уже прошло...) архитектура плагинов позволяет обращаться к методам плагина откуда угодно, что может стать удобным решением задачи.

Обращение к методу "Сделать хорошо"
Обращение к методу "Сделать хорошо"

Такой подход можно использовать везде: в компонентах, плагинах, библиотеках, модулях и т.д. Например, если в настройках компонента можно переключить источник данных - плагин-провайдер, то один путь - триггерить событие для группы этих плагинов. А можно вызвать нужный метод напрямую.

<?php
use Joomla\CMS\Factory;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Plugin\PluginHelper;

// Получим параметры компонента
$component_params = ComponentHelper::getParams('com_mycomponent');
// Получим имя плагина-провайдера
$plugin_name = $component_params->get('data_provider');
// Проверим, а включён ли плагин?
if(PluginHelper::isEnabled('system', $plugin_name))
{
     // Загрузим плагин
     $plugin_provider = Factory::getApplication()->bootPlugin($plugin_name, 'system');
     // Получим данные из него напрямую
     $external_data = $plugin_provider->getExternalData($any_id);
}

Теги:
+3
Комментарии0

Обновление компонента SW JProjects v.2.0.0

Скриншот панели администратора компонента SW JProjects в Joomla 5
Скриншот панели администратора компонента SW JProjects в Joomla 5

Компонент позволяет создать свой собственный каталог расширений Joomla (и не только) и предоставляет возможность скачивания, в том числе с использованием лицензионных ключей. Для разработчиков Joomla есть возможность для каждого расширения указать сервер обновлений, changelog url для отображения изменений прямо в панелях администратора сайтов ваших клиентов.

v.2.0.0. Что нового?

Joomla 5 ready. Сделан большой рефакторинг. Компонент переписан на архитектуру расширений Joomla 5 и работает без плагина обратной совместимости.

Новый дизайн. Для большинства разделов обновлён дизайн. Вы также можете создать свои собственные макеты и выбрать их в настройках компонента.

Оглавление в документации. Теперь при чтении документации вам доступны все разделы, связанные с данным расширением.

Плагины для вставки проекта в контент. Добавлено 2 плагина: контент плагин и плагин кнопки редактора. Контент плагин позволяет превращать non-SEF ссылки вида index.php?option=com_swjprojects... в SEF. А также обрабатывает шорт-коды вида {swjprojects project_id=1 tmpl=your_tmpl_name}. Таким образом вы можете вставлять информацию о проектах везде, где работают плагины контента. Плагин кнопки редактора позволяет легко вставлять ссылки или шорт-коды с выбранным макетом.

Исправление ошибок. Модуль категорий неправильно работал на мультиязычных сайтах, отображая данные на одном языке. Исправлено.

Страница расширения

GitHub расширения

Joomla Extensions Directory

Теги:
-1
Комментарии0

Подключение к этому сайту не защищено...

Когда веб-браузер не может «договориться» с веб-сервером о способе шифрования данных, сайт не открывается, а на экран выдаются сообщения: «Подключение к этому сайту не защищено. Этот сайт не может обеспечить безопасное соединение», «Не удаётся открыть эту страницу. Подключение было сброшено» или даже «Не удаётся получить доступ к сайту. Превышено время ожидания ответа от сайта».

В последнее время причиной таких нестыковок стала активация алгоритма согласования криптографических ключей Kyber768 в веб-браузерах, построенных на платформе Chromium. После включения этого механизма изменяется запрос, отправляемый веб-браузером для установки защищённого соединения TLS 1.3, но ещё не все серверы «умеют» правильно его обрабатывать, что приводит к досадным отказам в обслуживании.

Если попасть на веб-сайт всё-таки необходимо, то можно временно отключить в веб-браузере механизм Kyber768. Например, в Microsoft Edge для этого надо:

  1. Набрать в адресной строке текст:edge://flags/

  2. Набрать в строке поиска текст:TLS 1.3 hybridized

  3. Изменить значение параметра «TLS 1.3 hybridized Kyber support» с Default на Disabled

  4. Перезапустить веб-браузер

Отключение механизма Kyber768 в веб-браузере Microsoft Edge.
Отключение механизма Kyber768 в веб-браузере Microsoft Edge.

В других веб-браузерах поиск настройки отличается только текстом в адресной строке: chrome://flags — для Google Chrome, vivaldi://flags — для Vivaldi, и т. д.

Если после этого сайт стал открываться, то можно уведомить о проблеме его владельца. В противном случае значение изменённого параметра лучше восстановить.

Теги:
+3
Комментарии1

Как JIT в PHP 8 ускоряет парсинг CSV-файлов

С выходом PHP 8 появилась одна из самых мощных функций — JIT-компиляция. Она ускоряет выполнение PHP-скриптов, и это особенно полезно при парсинге больших CSV-файлов.

JIT компилирует opcode в машинный код, который выполняется напрямую на процессоре. В результате скомпилированный код используется в циклах, исключая повторную интерпретацию.

Как это помогает при обработке файла:

  1. Ускорение циклов: Цикл обрабатывает строки файла быстрее благодаря компиляции его тела в машинный код.

  2. Оптимизация работы со строками: Функции типа fgetcsv становятся эффективнее, что особенно важно при сложной обработке данных.

  3. Снижение накладных расходов: JIT минимизирует затраты на вызов функций, делая их выполнение более быстрым.

Можно провести эксперимент: подготовить CSV-файл с 10 миллионами строк и запустить PHP-скрипт — с включенным JIT и без него. Получится, что включение JIT позволит сократить время на парсинг файла примерно на 33%.

Больше деталей и пример скрипта найдете в Телеграм-канале Саши Шутая, нашего руководителя отдела PHP.

Теги:
+2
Комментарии3

Плюсы шаблона Saga для микросервисной архитектуры

Паттерн Saga используется в микросервисной архитектуре для управления распределенными транзакциями. В отличие от монолитных приложений, где транзакции происходят в одной базе данных, в микросервисах транзакции охватывают несколько сервисов, что требует особого подхода для сохранения целостности данных.

Например, вы разработали систему для покупки билета на самолет. В нем три сервиса: оплата, уведомление, бронирование. Сервис успешно списал деньги, выслал уведомление о покупке, но возникла ошибка на этапе бронирования. Как откатить изменения, когда у нас три независимых сервиса? В монолитном приложении нас бы спасли транзакции ACID. А в случае с микросервисами — Saga. 

Принципы работы Saga:

  1. Разбиение на шаги: Saga состоит из шагов (транзакций) в каждом микросервисе, таких как списание средств и бронирование.

  2. Компенсирующие транзакции: если один шаг не удался, запускаются компенсирующие действия для отмены изменений предыдущих шагов.

  3. Асинхронное выполнение: шаги могут выполняться асинхронно, а при ошибке запускаются компенсирующие транзакции.

Стратегии реализации:

  • Оркестрация: один сервис или оркестратор управляет всем Saga, что упрощает реализацию, но создает единую точку отказа.

  • Хореография: каждый микросервис сам управляет своими транзакциями и компенсирующими действиями, что делает систему более децентрализованной, но усложняет управление.

Читайте больше про веб-разработку в канале нашего руководителя отдела PHP Саши Шутая.

Теги:
+4
Комментарии4

Почему PWA лучше нативных приложений?

Прогрессивные веб-приложения полюбили крупные мировые бренды: маркетплейсы (AliExpress), крупные сетевые компании (Starbucks). А в России к ним присмотрелись банки, когда столкнулись с ограничениями сторов. Неограниченный доступ клиентов к услугам стал мощным преимуществом веба.

А какие еще плюсы у PWA для бизнеса и пользователей?

Они дешевле. Стоимость разработки прогрессивного веб-приложения примерно на 30% меньше нативной разработки. Над ним работает одна команда, а не две.

Не требуют принудительного обновления. Все обновления становятся мгновенно доступны пользователю. Бизнес не ждет апрува в сторах, а потом не тратит ресурсы, чтобы уговорить клиента обновить приложение.

Не ухудшают пользовательский опыт. Технология предполагает, что на рабочем столе размещается PWA со своей иконкой. Это выглядит абсолютно как приложение. Пользователь даже не подозревает, что это самом деле веб.

Не забивают память смартфона. PWA занимает на устройстве на порядок меньше места, чем нативное приложение. Сравните: PWA обычно “весят” единицы мегабайт, а мобильные приложения – десятки или даже сотни мегабайт.

Согласны, у PWA есть не только плюсы.

Большая статья обо всех нюансах PWA vs Native от СТО Clevertec уже готова: PWA vs Native: где приложения для iOS и Android больше никогда не пригодятся

Теги:
-1
Комментарии0

Пример принципа единственной ответственности для Joomla

Имеем:

Форму с полями город и пункт выдачи. Поля наследуют ListField.

<field
	name="city_id"
	type="city"
	label="City"
/>
<field
	name="point_id"
	type="point"
	label="City"
/>

Задача:

В методе getOptions класса PointField получить id выбранного города.

Очевидное решение:

Получим id города из данных формы. Такой способ применяется в ядре Joomla.

<?php
class PointField
{
	protected function getOptions(): array
	{
		$cityId = $this->form->getValue('city_id');
	}
}

Но через некоторое время нам может потребоваться добавить в форму ещё пару аналогичных полей. recipient_city_id и recipient_point_id.

Но теперь второе поле точки типа Point зависит от не своего поля город.

Как это исправить? Неужели делать отдельные типы полей для отправителя и получателя? А если у нас вообще не будет поля город?

Проблема в том что мы поручили классу PointField получение id города.
$cityId = $this->form->getValue('city_id');

А его единственной ответственностью должен быть вывод списка точек доставки из заданного города.

Уничверсальное решение:

Добавим полю Point атрибут city_id прямо в XML, или программно, в событии onContentPrepareForm.

<field
	name="point_id"
	type="point"
	city_id=""
	label="City"
/>
<?php
class PointField
{
	protected function getOptions(): array
	{
		$cityId = $this->element['city_id'];
	}
}

Теперь поле зависит только от своего атрибута.

Так же можно передавать и более сложные данные. Например. размеры посылки: {width:10,height:7,length:20}.

Теги:
+3
Комментарии0

Вышел Go 1.23!

Привет, Хабр!

В этом посте я напишу все основные изменения в новой версии Go:

  1. Range-over func

    Эксперимент с range-over func теперь основательно является частью Go

    Подробнее про range-over func читать здесь: https://go.dev/wiki/RangefuncExperiment

  2. Телеметрия

    Добавили Go Telemetry для отслеживания работы Go Toolchain. Сами разработчики Golang советуют включить эту опцию, так как она еженедельно будет анонимно отсылать информацию на https://telemetry.go.dev/ для улучшения работы Toolchain

    Подробнее про команду "go telemetry" читать здесь: https://pkg.go.dev/cmd/go#hdr-Manage_telemetry_data_and_settings

  3. Таймер

    Изменения также коснулись и "time.Timer" и "time.Ticker"

    Во-первых - "Тикеры" и "Таймеры", не упоминающиеся программой - становятся допустимыми для сборки мусора, даже если не был вызван метод "Stop"

    Во-вторых - теперь каналы "Таймера" и "Тикера" не буферированы. Это объясняется тем, что для вызова методов Reset или Stop не будет устаревших подготовленных значений

  4. Unique

    Добавлен новый пакет "unique": https://pkg.go.dev/unique

  5. Iter

    Добавлен новый пакет "iter": https://pkg.go.dev/iter

  6. Slices

    В пакет "slices" добавили несколько функций, которые работают с итераторами: https://go.dev/doc/go1.23#iterators

  7. Maps

    В пакет "maps" тоже добавили несколько функций для работы с итераторами: https://go.dev/doc/go1.23#iterators

  8. Structs

    Добавлен новый пакет "structs", который предоставляет новые типы для struct-полей: https://pkg.go.dev/structs

Это и еще многое читайте на официальном сайте Go!

Теги:
0
Комментарии2

Как создать веб-приложение на базе VK Mini Apps 📱

Написали пошаговую инструкцию, в которой:

  • показываем, как создать интерфейс на основе готовых адаптивных VKUI‑компонентов;

  • затрагиваем все основные библиотеки социальной сети;

  • устанавливаем сертификаты и подключаем проксирующий сервер;

  • разворачиваем в облаке и загружаем на платформу VK;

  • добавляем приложение в каталог, чтобы его легко находили пользователи.

Особые навыки администрирования не понадобятся. Берем небольшие вычислительные мощности (1 CPU с 512 МБ RAM) и простой Docker-файл.

Начать изучение →

Теги:
+4
Комментарии0

Go: маршрутизация без лишних пакетов

Привет, Хабр!

Недавно я открыл для себя “net/http” - роутер, который изначально есть в Go. В этом посте я опишу его удобство и, возможно, Вы - как и я, начнете его использовать, пусть он и не такой быстрый, как маршрутизаторы, основанные на fasthttp.

1. Не надо подключать сторонние пакеты

Достаточно только написать строку import “net/http”. Не надо подключать сторонние пакеты и тратить время на написание команд в консоли

2. Отличные возможности

В нем есть почти все то, что есть современных маршрутизаторах по типу Chi или GoFiber. Это очень удобно

3. Возможность расширения

Вы сами пишете многие функции. Значит, что не ограничены возможностями роутера

4. Контроль

Многое придётся делать самому ⇒ Вы будете знать, почему и как все происходит

Многое придётся делать своими руками, а в таком случае будете знать, почему и как все работает

Но, конечно, есть минусы:

1. Middleware

Придется писать все middleware собственными руками

2. Скорость

Он не такой быстрый, как роутеры, написанные с использованием fasthttp

3. Ошибки

Думаю, для многих это будет самым большим минусом. Нельзя возвращать ошибки из хэндлеров

Напишите в комментариях каким роутером пользуетесь Вы и почему именно им!

Теги:
0
Комментарии3

В сети вышло видео FastHTML за 100 секунд.

FastHTML — это новый веб-фреймворк Python, который позволяет легко создавать интерактивные веб-приложения без необходимости изучать фреймворк JavaScript, такой как React или Angular. Проект использует HTMX под капотом для включения динамических обновлений контента без полной перезагрузки страницы.

Теги:
+3
Комментарии0

Скрипт для отключения расширений, не входящих в ядро Joomla 3 (для обновления на Joomla 5+)

Перед обновлением сайта с Joomla 3 на Joomla 4 и выше нужно обновить все старые расширения до последних (для Joomla 3) версий. Затем отключить их, особенно системные плагины. Это делается для того, чтобы ничто не мешало процессу обновления. Для того, чтобы сделать это быстро - накидал скрипт, который отключает нестандартные расширения в Joomla 3.

➡️ Получить код скрипта (GitHub gist)

Файл disable_non_joomla3_extensions.php нужно положить в папку administrator вашего сайта и перейти по нему в браузере - yoursite.ru/administrator/disable_non_joomla3_extensions.php. Если всё успешно отключилось - выйдет сообщение.

XXX extensions that are not included in the Joomla 3 core have been detected and disabled. Make sure that they are disabled in the Site Admin Panel: Extensions - Extension Manager - Management.

Проверяем работу в менеджере расширений и после этого обновляем Joomla до Joomla 4 с помощью пакета обновлений Joomla 4.0.0. Обновляем Joomla 4 находясь на PHP 7.4 до конца. Меняем базу данных на MySQL 8+ (импорт-экспорт базы), поднимаем PHP до 8.1.

⚠️ Всё это делаем находясь ещё на Joomla 4. Обновиться нужно минимум до Joomla 4.4.0. Только после этого можно обновляться на Joomla 5 пакетом обновления 5.0.0. Затем обновляем все расширения и постепенно включаем их.

Теги:
+6
Комментарии3

Amvera Cloud представила работу с несколькими ветками Git, бэкапы PostgreSQL и управление портами. Обзор релиза

С августа 2024 в Amvera стал доступен новый функционал.

К проектам можно привязать произвольные ветки репозитория и развернуть staging и prod окружения, используя один репозиторий.

Что это даёт 

  • возможность командной работы.

  • возможность создать для одного репозитория staging и prod проекты. 

Как это работает

  • Вы создаёте нужное количество проектов со своими тарифами и переменными. Как пример - два проекта для стейджинга и прода вашего бота, где для стейджинга используется минимальный тариф, а для продакшн версии тариф с запасом;

  • Привязываете к каждому проекту ваш GitLab/GitHub/Bitbucket;

  • Выбираете ту ветку Git-репозитория, которая является основной для проекта;

  • Делаете git push и ваш проект развернут.

    Управлять портами и TLS-сертификатами проектов

    Ранее SSL-сертификаты выписывались автоматически, теперь их можно отключить. Как и организовать работу приложения с несколькими открытыми портами.

    Подключать автоматические планы создания бэкапов кластеров PostgreSQL.

Amvera — облако, где вы можете развернуть и обновлять приложение через команду git push amvera master. Без настройки виртуальных машин, SSL и установки зависимостей.

Теги:
+6
Комментарии0

Ближайшие события

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн

Совет по Joomla: как получать данные из суперглобальных массивов $_POST, $_GET и других?

На основе данных из $_GET, $_POST порой строится логика работы кода начиная от шаблона Joomla и кончая модулями и плагинами. Для работы с этими данными используется объект Input, который мы получаем из Приложения Joomla.

Приведу пример, часто использующийся при разработке шаблонов Joomla

<?php
/** @var \Joomla\CMS\Application\CMSApplication $app */
$app   = Factory::getApplication();
/** @var \Joomla\Input\Input $input */
$input = $app->getInput();

// Имя параметра и его значение по умолчанию
$option   = $input->get('option','');
$view     = $input->get('view', 'category');
$layout   = $input->getCmd('layout', 'edit');
$task     = $input->getString('task', '');
$itemid   = $input->getInt('Itemid', '');

В методе $input->get() 2-й аргумент - это значение по умолчанию на случай, если данных не обнаружено. 3-й аргумент - параметры фильтрации данных - будьте с ним внимательны. Например, вы хотите получить данные, отправленные на ендпоинт в виде JSON.stringify.

<?php
/** @var \Joomla\Input\Input $input */
$input->json->get('title', '', 'RAW')
// ИЛИ
$data = $input->json->getArray();

Если вы уверены, что данные должны быть именно в $_POST и нигде более, то получайте их именно оттуда.

<?php
/** @var \Joomla\Input\Input $input */
$title = $input->post->get('title', '', 'RAW');

Подробнее в файле libraries/vendor/joomla/input/src/Input.php.

Теги:
+3
Комментарии0

Работа с данными в JavaScript — в пятой серии открытого курса по JS

Это новый курс от инженеров AvitoTech — вместе с фронтендером Василием Новиковым разбираемся в базовых технологиях веб-разработки в JavaScript.

В этой серии изучаем проблемные числа, разбираемся с мантиссой, экспонентой и сдвигом, пытаемся понять арифметику стандарта IEEE 754. Знаете, почему 0,1 и 0,2 в сумме не дают 0,3? Смотрите, и всё поймёте!

А если знаете — всё равно смотрите, вспоминать базу всегда полезно!

Теги:
+13
Комментарии0

Список устаревших классов ядра Joomla 1.6-3.10 и их современные аналоги в ядре Joomla 5.x

Разработчикам при обновлении расширений на архитектуру Joomla 4 / Joomla 5 нередко не сразу удаётся найти аналоги устаревших методов ядра. Особенно, если под рукой нет современной среды разработки (IDE), например PHP Storm, который подсказывает нужные методы ядра Joomla. Без него, конечно, разработка для Joomla становится непростым делом. В этой статье вы найдете табличку соответствия старых и новых названий PHP классов ядра Joomla и её расширений для того, чтобы быстрее и легче было обновить свои расширения. Эти классы пока что можно использовать в случае, если включён плагин обратной совместимости Joomla 4 / Joomla 5. Но в Joomla 6 или последующих версиях он может быть удалён.

Подробнее: Список устаревших классов ядра Joomla 1.6-3.10 и их современные аналоги в ядре Joomla 5.x.

Теги:
-1
Комментарии0

Омар Шехата поделился одним из своих самых популярных проектов. Это крошечное веб-приложение JPEG Viewer для демонстрации алгоритмов, которые работают в формате сжатия JPEG.

Страница демонстрирует, как изображение разбивается на блоки 8×8 пикселей, каждый из которых затем подвергается алгоритму дискретного косинусного преобразования. Упрощённо можно сказать, что каждый из блоков математически преобразуется из двумерного изображения в сигнал, а затем представляется как сумма синусоид. Интересно в инструменте Омара то, что он допускает ручное редактирование преобразования каждого из блоков 8×8 пикселей.

Также Омар рекомендует свою статью про алгоритмы сжатия JPEG, в которой он применил схожие инструменты.

Теги:
+3
Комментарии1

Представлен открытый проект Hyperscript. Это гибкий скрипт для обработки сложных конфигураций и запросов. Проект поддерживает различные методы HTTP, включая GET, POST, PUT и DELETE, и предоставляет обширные возможности для проверки ответов на соответствие указанным условиям.

Hyperscript поддерживает нескольких методов HTTP, включая опции простой настройки и тестирование запросов GET, POST, PUT и DELETE.

В Hyperscript есть редим гибкой проверки и проверки ответов на основе кодов состояния, типов содержимого и определённого содержимого.

Проект поддерживает настраиваемые условия, включая проверку наличия определённых значений в теле ответа или нахождения числовых полей в указанных диапазонах. Также в Hyperscript есть подробная отчётность и получение подробных сообщений об успешном и неудачном выполнении с дополнительным подробным выводом.

Проект написан на языке Python и опубликован под лицензией MIT.

Теги:
+1
Комментарии0

Совет по Joomla: метод HTMLHelper::image() для рендера изображений

В API Joomla есть довольно богатый инструмент - класс HTMLHelper. С его помощью можно выводить различные HTML-элементы с нужными параметрами: модальные окна, аккордеоны, табы, изображения и т.д.

Наглядности и чистоты кода ради стоит использовать этот метод, дабы не делать бесконечную конкатенацию HTML с PHP кодом и не потерять глаза в поисках утерянной кавычки.

Самый простой способ рендера изображений - с 2-мя аргументами:

  • $img - путь к изображению

  • $alt - текст для атрибута alt изображения 3-й необязательный параметр - массив или строка с атрибутами изображения: class, title, различные data-атрибуты, onclick, loading и т.д. Я предпочитаю удобно и наглядно собрать атрибуты в массив, использовать условия в PHP, а не HTML коде.

<?php
use Joomla\CMS\HTML\HTMLHelper;

$img_src = 'images/banner.webp';
$img_attribs = [
    'loading' => 'lazy',
    'class'=>'img-fluid',
    'data-custom-attr'=>'your-custom-data-attr-value',
    'title'=> 'Title attribute for image'
];

echo HTMLHelper::image($img_src,'Alt text for image', $img_attribs);

Если изображение найдено - получим HTML-разметку <img src="..."/> с нашими данными. Если не найдено - null.

Ещё 2 параметра, которые используются реже и связаны с одной из главных фишек Joomla - функционалом переопределений. Но их описание не укладывается в размер поста на Хабре 😢

Теги:
+5
Комментарии0

Go для веб-разработки

Взято с https://www.linkedin.com/pulse/exploring-go-language-web-development-muhammad-irfan-q3nvf

Привет, Хабр!

Одна из тех вещей, которыми я занимаюсь с использованием Go — веб разработка. Я могу написать как фулл‑стэк вебсайт, так и просто бэкэнд. В этом коротком посте я дам Вам несколько советов и практик по веб‑разработке с использованием Golang

1. Роутеры

Есть много роутеров, и я советую попробовать каждый, чтобы найти лучший для себя. Но если Вы не хотите этого делать, то вот несколько хороших роутеров:

  1. Chi router — роутер, которым я пользуюсь. Полная совместимость со стандартным пакетом Go

  2. Go fiber — скоростной роутер

2. Jet templates

Очень удобная библиотека для использование темплэйтов. Очень упростила мне жизнь, если Вы пользуетесь теплэйтами в Go — упростит и Вам

3. Используйте middleware

Не используете middleware — ошибка. Не используете встроенные в пакет роутера middleware — фатальная ошибка. Есть очень много хороших middleware, которые уже встроены в используемый Вами роутер, например — Chi. Очень полезно использовать «Recoverer», или подобные.

4. Используйте аккуратную и удобную Вам структуру проекта

Не создавайте все файлы вместе. Разбейте все по папкам, как удобно Вам, в интернете есть много примеров

Вот и все, надеюсь я хоть как‑то Вам помог! Еще можете почитать мои посты по темам Golang: лучшие практики, 5 библиотек Golang для эффективной разработки веб‑приложений и т. д.

Теги:
+3
Комментарии2
1
23 ...

Вклад авторов