Anonymous
🍸 Как построить масштабируемый API на Go с помощью Gin Что такое Gin? Gin  —  это самый популярный высокопроизводительный фреймворк для Go (Golang), с помощью которого можно создавать веб-приложения. Если вы знакомы с ExpressJS, то Gin очень на него похож, и работать вам с ним будет довольно удобно. Что мы будем создавать? Проект у нас будет стандартный. Мы создадим простой API для работы с книгами. Не волнуйтесь, хоть ваш проект и будет основан на масштабируемом подходе, сам API окажется довольно простым, и проблем с пониманием процесса не возникнет. Что необходимо? Вам потребуется базовое понимание Go. Лично я в качестве редактора кода использую Visual Studio Code, вы же вольны выбирать на свое усмотрение. Только имейте ввиду, что в статье вам встретится команда code .  —  это собственная команда VSCode, которая открывает в редакторе текущий каталог. ➡️ Читать ⚙️ Github @Golang_google
Fiber 🫥
Rostislav
Интересно, что имел в виду автор под масштабируемостью? Фреймворк прибитый гвоздями к приложению? Или может начало проектирования приложения с БД. Не совсем понятно конечно
Артем
Привет! Подскажите какую нибудь либу для генерации excel файлов из json. JSON могут быть разной структуры, под каждую не охота писать вручную
Eldos
Привет! Подскажите какую нибудь либу для генерации excel файлов из json. JSON могут быть разной структуры, под каждую не охота писать вручную
Привет. https://www.google.com/search?q=golang+excel+files+to+json&rlz=1CDGOYI_enKZ926KZ926&oq=golang+excel+files+to+json&aqs=chrome..69i57j0i546.10288j0j4&hl=en-US&sourceid=chrome-mobile&ie=UTF-8
Артем
Привет. https://www.google.com/search?q=golang+excel+files+to+json&rlz=1CDGOYI_enKZ926KZ926&oq=golang+excel+files+to+json&aqs=chrome..69i57j0i546.10288j0j4&hl=en-US&sourceid=chrome-mobile&ie=UTF-8
Во первых, наоборот, во вторых, уж конечно я сначала сам попробовал поискать, но не нашёл чего-то стоящего
Eldos
Сорри, понял 😅
Vladislav
Во первых, наоборот, во вторых, уж конечно я сначала сам попробовал поискать, но не нашёл чего-то стоящего
а вы всерьёз думаете, что кто-то делал либу генерации эксель файлов, и непременно из данных в жсон?
Vladislav
или может это надо разбить на две подзадачи? прочитать жсон и записать эксель-файл
whois
Друзья, может кто-то сталкивался. Когда в zap логере дергаю функцию with(fields ...Field), она возвращает новый инстанс логера. Но есть проблема - сбрасывается настройка - формат логирования. Т.е. вместо "console", начинает использовать видимо дефолтный формат json. log, err := loggerInit() if err != nil { panic(err) } log.Info("message") log2 := log.With(zap.String("key-1", "val-1")) log2.Info("message-2") Может кто-то уже сталкивался с такой проблемой, подскажите плиз, как решали?
Илья
дополнительные поля пишутся в жсон
anhckie
вводные данные: есть сервис, в рамках которого будут запускаться процессы в отдельных горутинах каждые n времени. проект разрабатываю на базе подхода «чистая архитектура» (слои репозитории, энтити, юзкейсов, протоколов). проблема: в кроне будет происходить итерационный вызов N апишек, ссылки на которые лежат в БД. если данные были получены из первой, то в следующие мы не пойдем, а запишем в базу и задачу считаем выполненной. (!) чтобы понять, в какие апишки из всех, что лежат в базе, нужно ходить - у них есть статус 1/0. так вот, политики работы с апишками могут отличаться, но не особо критично. сейчас у меня в микросервисе 1 основной юзкейс - дернуть апишку, получить строку и все. юзкейс работает с репозиториями. вопрос - как это организовать, если логика работы с апишкой может отличаться? ну типа получил я 2 апишки из бд, надо начинать работать с первой. где хранить логику работы с этой апишкой)
anhckie
сумбурно объяснил, возможно, но если что попробую еще раз
anhckie
проблема именно в том, что получив n адресов апи из базы, нужно итерационно пробовать работать с каждой из них. заранее я не знаю какие это апи могут быть, очевидно. где хранить логику работы с ними и вообще как соотнести строку, полученную из бд, с где-то лежащей логикой апи)
anhckie
в пхп это можно было накостылять динамическими переменными и инклюдами, гоу же не может так во, он должен знать имя уже во время компайлтайма
anhckie
может, вообще подход тут поменять надо как-то
anhckie
я ж не хочу иф елсе делать и сравнивать с константами и там наливать логику работы с апи
anhckie
либо же на уровне транспорта ходить в базу, получать апишки, а потом… а потом мне все равно надо понять к какой апи какую логику прикрутить)
anhckie
короче, мысли вслух. поделитесь и вы))
Сергей
Паттерн стратегия напрашивается.
anhckie
типа, написать интерфейс, написать файлы с апишками, которые бы реализовывали этот интерфейс по-своему - я так и планирую (кстати, не знал, что это называется стратегией 😅). проблема в том, как клиентскому коду понять, какую стратегию использовать, из полученных в базе? ну лежит у меня в базе урл и название апишки в стринге. как мне это замапить на конкретную стратегию?
anhckie
по сути, спотыкаюсь об какой-то тривиальный вопрос, походу)
anhckie
https://refactoring.guru/ru/design-patterns/strategy/go/example
Rostislav
switch case
anhckie
вот я этого избежать хочу, но не пойму как
anhckie
в пыхе динамическими переменными зарешалось бы, в гошке нет альтернатив?
Rostislav
Ну это надо сделать на начальном этапе. Получили из бд какой-то урл, определили какая для него нужна логика, создали соответствующий объект, у которого метод работает так как нужно для этого урла. А потом все созданные таким образом объекты запускаем вызовом этого метода
Maks
Можно так же в бд идентификатор стратегии хранить а стратегии в мапе
Maks
и из мапы по ключу брать
Maks
Что бы не свитчкейсить
Maks
они же в любом случае должны быть все инициализированны заранее (точнее могут быть)
Maks
Можно сделать что бы инициализировались когда по ключу не найдено
anhckie
и из мапы по ключу брать
ну тогда у меня захардкоженная мапа получается
anhckie
если я там заранее по ключам буду распихивать стратегии
anhckie
если я тебя правильно понял
Maks
А ты хочешь каждый раз генерировать новый класс?
Maks
точнее структуру
Maks
со стратегией
anhckie
хочу динамически подставлять в свой юзкейс эту структуру-стратегию)
anhckie
но походу оно только или свич кейсом решается, или преаллоцированной мапой со списком апишек и стратегий
Maks
Так ты и подставляй. Просто бери из мапы. А так ты каждый раз будешь инициализировать структуру когда тебе нужно будет стратегию заюзать какую то
Maks
Если через свитч кейс
Maks
а оно тебе надо?
Maks
Единственное, когда у тебя используется заранее проинициализированная мапа со стратегиями, нельзя что бы стратегия внутри себя какие то переменные хранила которые могут меняться в процессе выполнения стратегии.
anhckie
окей, мапа выглядит следующим образом: ключ - строка с названием апишки значение - структура-стратегия, реализовывающая их интерфейс. вопрос - апишек на данный момент до 60 штук, «включенных» только 5. мне надо все 60 в мапу запихнуть, ведь вдруг какую-то из них включат в какой-то админке?)
anhckie
А почему свич кейс не нравится?
скорее сомнения, так как перешел с пыхи в гоу и вот нехватка динамических переменных поставил в тупик)
anhckie
и момент хардкода вызывает сомнения, что я в адеквате ))
Rostislav
скорее сомнения, так как перешел с пыхи в гоу и вот нехватка динамических переменных поставил в тупик)
ну в любом случае где-то должен быть момент, где строка из бд связывается с каким-то объектом. Другой вопрос, как это сделать. Можно через свич кейс, можно через мапу.
Maks
почему?
Потому что если у тебя будет 2 параллельных вызова а эта переменная где то будет использоваться, то ты ее можешь перезаписать и логика сломается. У тебя же приложение живет пока запущено, в отличии от пыхи
anhckie
а, ты в плане тред сейфа) да, согласен
Maks
Я на джаве когда плагин пилил для жиры жирный - у нас был плавающий баг)
Maks
Как раз с этим было связано)
anhckie
ну в любом случае где-то должен быть момент, где строка из бд связывается с каким-то объектом. Другой вопрос, как это сделать. Можно через свич кейс, можно через мапу.
со свичем конечно ряд сложностей, бо если первая апишка не отрабывает, надо идти во вторую - значит, надо инициализировать новую стратегию и тогда сюда надо навешивать вечный цикл с контекстом или шото такое (пока не представил в голове как именно делать)
Maks
Там переменная локальная была внутри класса и она в методах юзалась, но менялась когда приходил запрос. Все переменные надо передавать в качестве аргументов)
Maks
Как же я долго искал нормальную клаву с двумя беспроводными интерфейсами в замет g613) думал взять g915tkl но она плохого качества за свои бабки так темболее. Нашел Varmilo Cliff Bot: Lie VCS87. Годнота относительно.
Maks
Мне просто нужно 2.4Ghz + синийзуб. Что бы я мог легко переключать клаву между ПК и рабочим ноутом)
Maks
мне на 915 не понравилось крепление кейкапов. Оч тонкий пластик. Не редко пишут что ломается
Сергей
В Php я стратегии накидывал в провайдер. У каждой стратегии есть метод support, где проверяется подходит она или нет. В провайдере метод getStrategy, где в цикле перебираются стратегии и в зависимости от условия выбирается нужная
Юра (Юрий Александрович)
я ж не хочу иф елсе делать и сравнивать с константами и там наливать логику работы с апи
Извините, если отвечаю ненужное, пишу с телефона, ничего не вижу. Вам нужно на этапе инициализации приложения составить справочник реализаций ваших апи, и в зависимости от ответа вызывать нужное апи из справочника.
Юра (Юрий Александрович)
Реализациями могут быть функциии одигаковой сигнатуры или структуры одинакового интерфейса.
Юра (Юрий Александрович)
В любом случае, вам нужно не просто накидать всяких реализаций в ваш пакет, а собрать из них при запуске приложения некоторую структуру, с которой потом работать.
Юра (Юрий Александрович)
Можно попробовать так ( но это гипотеза, пусть уточнят те, кто хорошо знает рефлексию): рефлексией проанализировать наш пекейдж, найти в нем все типы, реализующие определенный интерфейс, и собрать из них рабочую структуру. В .Net я бы сделал именно так. Возможно, в Го рефлексия это же позволяет.
deusbog
Всем прив
deusbog
Кто то может написать мне парсер Unix porn для определения самого популярного рабочего стола?
deusbog
Денег нет
deusbog
Так что тот кто возьмётся за эту задачу придётся работать на чистом интузиазме.
Alexey
Шут гороховый чисто
Anton
> Junior DevOps engineer