Anonymous
Но можешь и printf'ами ))
Anonymous
а, я тупой
Anonymous
надо было заюзать panic(err)
пофиксил уже))
Anonymous
Anonymous
Как сделать так чтобы при создании этой структуры мапа requestParams сразу создавалась? чтобы не писать в функции make(map[string]string)
SealTV
Почему не пойти простым путём и не сделать функцию newMyStruct которая будет возвращать объект структуры с созданной мапой
Anonymous
Stepan
Stepan
Так оно и самое правильное)
SealTV
ну вот и мне так оно кажется)
Anonymous
Коллеги, посоветуйте как можно решить след. задачку.
У меня есть работа с несколькими апи. У каждого апи свой клиент со своим интерфейсом.
Я реализовал функционал обертку, который позволяет оперировать пулом подключений к апи в виде вызова лямбда ф-ций.
someApi1.call(func(api1Client *api1Client){
err = api1Client.call1();
if err !=nil {
return err
}
return nil
} error)
someApi2.call(func(api2Client *api2Client){
err = api2Client.call1();
if err !=nil {
return err
}
} error)
Проблема в том, что из-за разных типов клиентов api1Client и api2Client мне приходится дублировать данный функционал.
Как бы вы сделали данную реализацию, чтобы не дублировать код?
я могу сделать там interface{} в параметрах, тогда в самой ф-ции надо кастовать в нужный тип, чем не хочется заниматься
Aleksandr
Не совсем понял, но может хранить пул более низкоуровневых http request?
Aleksandr
Ну ты понял, вызовы http клиента, а не обертки над ним
Anonymous
cчитай что api1Client и api2Client это вообще не похожие типы, которые даже прикладным протоколом не пересекаются. что в принципе и есть так 🙂 так что про http тут, к сожалению, речь идти не может
Anonymous
обертка делает то, что подбирает из пула нужный клиент.
Anonymous
и для двух типов клиентов приходится задублировать этот функционал подбора из-за разных типов
Andrei 🦉
рефлексия или кодогенерация)
Andrei 🦉
"42" в мире го
Aleksandr
а, хочется держать пул реквестов разных протоколов?
Aleksandr
ну тогда да, тысячу раз обсуждали
Anonymous
суть в том что в обертку вынесена логика подбора и итерирования по пулу клиентов.
скажем так это что-то вроде умного лоад-балансера.
и хочется ее юзать для разных типов клиентов.
Anonymous
и не хочется из-за разности типов для каждого типа писать копию этой логики.
Anonymous
Anonymous
Мб запилить через интерфейсы? И в функции большой case для каждого типа.
Anonymous
Мб запилить через интерфейсы? И в функции большой case для каждого типа.
ф-ции в принципе одноразовые, тк передаются через параметры, те там даже не кейс а просто каст к конкретному типу. тк передавать ф-ции будет код, который работает с конкретным типом клиента. Это реализуемо. Но мне кажется может быть по-проще и попрямее и без интерфейсов. Но придумать не могу.
Anonymous
Anonymous
Aleksandr
кстати, давали ссылку на что-то типа 50 мест где можно выстрелить себе в ногу (про го речь).
вот тут же я стреляю в ногу:
_, err := db.DbConnection.Query("select 1 from "+entity+" where slug = $1 limit 1", slug)
rows не беру из результата выполнения запроса и соотственно не закрываю его?
Alexei
Alexei
есть же Exec
Aleksandr
Alexei
или если одну строку, то QueryRow
Aleksandr
вернет ErrNoRows или nil
Alexei
если QueryRow - то вернет ErrNoRows, если строки нет
Aleksandr
Alexei
Alexei
доки вообще никто не читает?
Anonymous
ошибку и после exec можно получить ведь, не надо обязательно результат получать. разве нет?
Aleksandr
Alexei
if err = db.QueryRow("select slug where....", slug).Scan(&slug); err == sql.ErrNoRows { bla-bla-bla }
Anonymous
Ребята, давайте жить дружно!
Anonymous
Aleksandr
Alexei
слушай, ты вопрос прочел?
прочел, хз, что будет с потеряным rows, поскольку ты его не перебираешь в последнем Next не вызывается Close
Alexei
с Exec - не знаю, вернется ли ошибка
Aleksandr
Alexei
МНТ же
Anonymous
_, err := repo.db.Exec(
“…”)
if err != nil {
чем это не решение?
Aleksandr
Alexei
тоже самое
Anonymous
Вот это и интересно.
попробовать в for loop'е, посмотреть на жор коннектов/оперативы ))
Anonymous
точнее даже не так.
Alexei
Alexei
Alexei
и да, в некоторых драйверах last id возвращает
Alexei
в pgsql, например, не возвращает )
Anonymous
Anonymous
в принципе их тоже можно включить
Anonymous
а без oids надо
INSERT …
RETURN id
Anonymous
)
Aleksandr
_, err := repo.db.Exec(
“…”)
if err != nil {
чем это не решение?
получается вот так:
res, err := db.DbConnection.Exec("select 1 from "+entity+" where slug = $1 limit 1", slug)
if err != nil {
return false
}
affected, err := res.RowsAffected()
if err != nil {
return false
}
return affected == 0
Anonymous
Aleksandr
норм
Zloy-Dobry
Парни, прэд! А насоветуйте мне библиотечку для UI под мак?
Заур
Заур
Там вроде qt для голанга тоже был. Что-то такое видел
Alexei
там qt qml для голанга, вроде, без gui
Заур
Аа, видимо