Мирон
ну так это же лишнее копирование интерфейса
Maks
Че пацаны
Maks
сегодня ревьюим законодательство о призыве?:)
Victor
Maks
ууу, не гитлабовец
Мирон
О НЕТ! Вас мобилизовали! Отправь это сообщение 4 друзьям, чтобы откосить! 💸
Илья
Maks
Там есть вроде один
Maks
Закон гласит что категория годности В - только в случае военного положения призывается. Но можно призывать на военные сборы. Соответственно с этой категорией вообще не должны призывать.
Maks
Однако как на практике не известно.
Vladislav
всё норм
Не ну это
anhckie
anhckie
func (uc *ExpUC) Invoke(l logger.Interface) {
ctx, cancel := context.WithCancel(context.Background())
ch := make(chan struct{})
exps, err := uc.repoExp.ListActiveExps(ctx)
if err != nil {
l.Error(err)
}
var wg sync.WaitGroup
wg.Add(len(exps))
for _, value := range exps {
curr, err := uc.repoCurr.ListExpCurr(ctx, value.ID)
if err != nil {
l.Error(err)
}
exp := expsStrategies[value.Name]
value := value
go func() {
defer wg.Done()
defer func() {
if r := recover(); r != nil {
l.Error("Recovered. Error at "+value.Name+": \n", r)
}
}()
exp.Invoke(ctx, ch, l, curr, uc.repoCDP) // тут основная логика
}()
}
<-ch
cancel()
wg.Wait()
}
anhckie
// logic
func (bc bc) Invoke(ctx context.Context, send chan<- struct{}, l logger.Interface, curr []entity.Curr, cdp repo.CreateCDP) {
a := fiber.AcquireAgent()
a.Timeout(time.Second * 3)
req := a.Request()
req.Header.SetMethod(fiber.MethodGet)
for _, value := range curr {
req.SetRequestURI(value.ExpUrl)
if err := a.Parse(); err != nil {
panic(err)
}
_, body, errs := a.Bytes()
l.Error(errs)
var resp APIResponse
if err := json.Unmarshal(body, &resp); err != nil {
panic(err)
}
var cr interface{}
if resp.Data.Cr != 0 {
cr = resp.Data.Cr
} else if resp.Data.CrApproximate != "" {
cr = resp.Data.CrApproximate
}
_, err := cdp.CreateCD(context.Background(), repo.CreateCDP{CurrID: value.ID, CS: cr})
if err != nil {
l.Error(err)
}
select {
case <-ctx.Done():
l.Info("Exp finished work as well.")
case send <- struct{}{}:
}
}
}
𝓢𝓮𝓻𝓰𝓮𝔂
Народ, а как в gin можно вручную валидацию на уже забинденную структуру натравить?
anhckie
оно работает, но хочется поправить, чтобы было ок, а то первый раз пилю свой проект
anhckie
шоб "нормально"
anhckie
то есть логика щас такая, что по крону стартую некоторую бизнес-логику, в ней с помощью паттерна стратегия подбирается необходимое поведение работы с апишками, если хотя бы одна апишка отработает и мы получим данные - остальным не надо
Илья
// logic
func (bc bc) Invoke(ctx context.Context, send chan<- struct{}, l logger.Interface, curr []entity.Curr, cdp repo.CreateCDP) {
a := fiber.AcquireAgent()
a.Timeout(time.Second * 3)
req := a.Request()
req.Header.SetMethod(fiber.MethodGet)
for _, value := range curr {
req.SetRequestURI(value.ExpUrl)
if err := a.Parse(); err != nil {
panic(err)
}
_, body, errs := a.Bytes()
l.Error(errs)
var resp APIResponse
if err := json.Unmarshal(body, &resp); err != nil {
panic(err)
}
var cr interface{}
if resp.Data.Cr != 0 {
cr = resp.Data.Cr
} else if resp.Data.CrApproximate != "" {
cr = resp.Data.CrApproximate
}
_, err := cdp.CreateCD(context.Background(), repo.CreateCDP{CurrID: value.ID, CS: cr})
if err != nil {
l.Error(err)
}
select {
case <-ctx.Done():
l.Info("Exp finished work as well.")
case send <- struct{}{}:
}
}
}
а можешь в на какой-то сайт закинуть?
anhckie
типа на плейграунд?
anhckie
оно ж там не отработает, бо тут интерфейсы и блабла(
anhckie
разве что визуально чтоб читалось лучше?
Roman
Добрый день, работал кто с ed25519?
message - что там может быть? публичный ключ?
func Sign(privateKey PrivateKey, message []byte) []byte
Roman
Vladislav
Roman
спасибо
Юра (Юрий Александрович)
Vladislav
Sweety
Можно вопрос задам? Я тут документацию к sync.Cond читаю и https://pkg.go.dev/sync@go1.19.1#Cond не понимаю зачем он нужен если по факту можно использовать канал просто и все? либо если уж совсем костыль то через атомики и какой-нибудь флаг uint32
Vladislav
Илья
Sweety
Sweety
канал под капотом лочит мьютекс при записи и чтении в том числе + создает более грамоскую структуру чем конд
Vladislav
Roman
Юра (Юрий Александрович)
чем сообщение может быть?
... последовательностью байтов?
Чем угодно, что представимо в виде последовательности байтов.
Илья
Илья
он напрямую останавливает и запускает горутины
Broadcast
Signal
Wait
Илья
того же можно добиться с помощью каналов, но там внутренняя логика намного сложнее и мы будем зря аллоцировать не используемые компоненты
NU
Всем привет, когда убиваю процесс, он убивает родителя, остается зомби, как его тоже замочить? Может есть ссылочки какие нибудь
NU
Имеется в виду, в гошке
Alexandr🇷🇺
Чего?
Alexandr🇷🇺
У тебя тип есть процесс, который порождает процессы, но когда ты киллишь свой процесс, то дочерние остаются?
Alexandr🇷🇺
Правильно понял?
NU
Да
Alexander
а как он убивает родителя?
Alexandr🇷🇺
Alexander
зачем в гошке плодить процессы?
NU
Сорян, не уточнил, запускаю гошку в линуксе
Alexandr🇷🇺
Alexander
похоже на подход из однопоточного мира
Mark 𓁹
Mark 𓁹
хотя там есть воркеры
Ilya
Q
доброе утро, есть у кого опыт нормализации текста для отправки SMS в кодировке gsm7?
Ilya
отличие одного от другого - в слове "интерактивный",
То есть это для тех, кто не может в памяти удержать пару шагов? В чем смысл интерактивности? В шелле нажатие стрелочки вверх возвращает предыдущую команду, после которой можно написать пайп. Чем принципиально отличается от интерактивности это приложения?
Sergey
ну как пример - вы нажимаете букву и показывается список со всеми совпадениями, нажимаете еще, список меняется. И это касается не только шела. Даже с вашим примером - вводите пару букв и нажимаете вверх и будет показываться только та история, что соответствует введенному шаблону. Грепом это можно реализовать, но это не рентабельно, при каждом нажатии придется пропускать через фильтр всю последовательность не оптимальным способом. Это как сравнить поиск по строкам в текстовом файле и поиск в базе данных по индексу
Mr.
Привет всем! Товарищи, никто не сталкивался с тем, что VS code неправильно определяет GOPATH и ищет либы не там? Как решали данную проблему? Или я что то не так делаю?
Mr.
Aртем
Mr.
NU
startLogFile, _ := os.OpenFile("/var/log/start.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) —-ребят подскажите почему данная строка не создает файл? она должга создать его если нет, и записать данные, он записывает только если есть файл, но если нет, то ничего не происходит(((
NU
Илья
ошибки для начала проверь
Илья
скорее всего permission denied
Null
✔️ [Golang] Ошибки, которые нельзя обработать
Паника в горутине
Если мы в обработчике будем использовать горутину, которая по каким-то причинам вызвала панику, Golang не сможет обработать эту панику и приложение упадет с ошибкой и все запросы, которые сейчас обрабатывает сервис оборвутся.
Eсли написать примерно вот такой код
type User struct {
Email string
}
func UpsertUser(r *http.Request) (User, error) {
return User{}, nil
}
func SendEmail(u User) {
panic("sending email is not implemented")
}
func CreateUser(w http.ResponseWriter, r *http.Request) {
user, err := UpsertUser(r)
if err != nil {
// handling error
}
go func() {
SendEmail(user)
// may be something else
}()
}
То при вызове функции CreateUser сервис упадет.
Для того, что бы исправить это, нужно обрабатывать паники в каждой горутине
➡️ Читать дальше
@Golang_google
Mr.
Кажется, я нашел проблему, сейчас попробую решить)
Если кратко: у меня GOPATH был прописан не в bashrc, а в zshrc, так как терминал в vscode запускает zsh -- там GOPATH изменился, а VS code я запускаю из Rofi и для запуска он использует bash, в котором GOPATH не изменился со стандартного.
Сейчас запустил VS code из терминала и ошибка ушла
Mr.
Так что если меняете GOPATH и используете zsh -- лучше пишите GOPATH и в bash и в zsh конфиге)
NU
✔️ [Golang] Ошибки, которые нельзя обработать
Паника в горутине
Если мы в обработчике будем использовать горутину, которая по каким-то причинам вызвала панику, Golang не сможет обработать эту панику и приложение упадет с ошибкой и все запросы, которые сейчас обрабатывает сервис оборвутся.
Eсли написать примерно вот такой код
type User struct {
Email string
}
func UpsertUser(r *http.Request) (User, error) {
return User{}, nil
}
func SendEmail(u User) {
panic("sending email is not implemented")
}
func CreateUser(w http.ResponseWriter, r *http.Request) {
user, err := UpsertUser(r)
if err != nil {
// handling error
}
go func() {
SendEmail(user)
// may be something else
}()
}
То при вызове функции CreateUser сервис упадет.
Для того, что бы исправить это, нужно обрабатывать паники в каждой горутине
➡️ Читать дальше
@Golang_google
Андрей Беренда топ)
NU
NU
какой мидлвар нужен чтобы этот респонс от запроса тоже в логи записывал?
NU