Anonymous
как тут дебажить? О_о
Кэп подсказывает, что юзать дебаггер ))
Anonymous
Но можешь и printf'ами ))
Anonymous
Но можешь и printf'ами ))
Ну нашел я строку с ошибкой, лучше не стало (
Anonymous
Ну нашел я строку с ошибкой, лучше не стало (
Больше printf'ов богу printf'ов! P.S. Ясен перец, лучше станет только когда обраружите источник ошибки.
Anonymous
а, я тупой
Anonymous
надо было заюзать panic(err) пофиксил уже))
Anonymous
У меня есть вот этот код
Anonymous
Как сделать так чтобы при создании этой структуры мапа requestParams сразу создавалась? чтобы не писать в функции make(map[string]string)
SealTV
Почему не пойти простым путём и не сделать функцию newMyStruct которая будет возвращать объект структуры с созданной мапой
SealTV
А разве это не есть тот самый true вариант?
Ну может тут есть гуру которые могут предлажить более хитрый и удобный способ))) А так то это самое очевидное решение
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
а, хочется держать пул реквестов разных протоколов?
Aleksandr
ну тогда да, тысячу раз обсуждали
Anonymous
суть в том что в обертку вынесена логика подбора и итерирования по пулу клиентов. скажем так это что-то вроде умного лоад-балансера. и хочется ее юзать для разных типов клиентов.
Anonymous
и не хочется из-за разности типов для каждого типа писать копию этой логики.
Anonymous
ну тогда да, тысячу раз обсуждали
ну раз 1000, то и 1001 ничего не изменит ведь?
Anonymous
Мб запилить через интерфейсы? И в функции большой case для каждого типа.
Aleksandr
ну раз 1000, то и 1001 ничего не изменит ведь?
для меня нет. но ты в чате давно, видел и участвовал не в одной дискуссии на жту тему
Andrei 🦉
и не хочется из-за разности типов для каждого типа писать копию этой логики.
делаешь общий темлпейт и генеришь из него код для разных типов, либо копаешься в типах с помощью рефлексии в рантайме, ловя паники, ничего другого в го нет
Anonymous
Мб запилить через интерфейсы? И в функции большой case для каждого типа.
ф-ции в принципе одноразовые, тк передаются через параметры, те там даже не кейс а просто каст к конкретному типу. тк передавать ф-ции будет код, который работает с конкретным типом клиента. Это реализуемо. Но мне кажется может быть по-проще и попрямее и без интерфейсов. Но придумать не могу.
Aleksandr
кстати, давали ссылку на что-то типа 50 мест где можно выстрелить себе в ногу (про го речь). вот тут же я стреляю в ногу: _, err := db.DbConnection.Query("select 1 from "+entity+" where slug = $1 limit 1", slug) rows не беру из результата выполнения запроса и соотственно не закрываю его?
Alexei
есть же Exec
Aleksandr
так а зачем query, если тебе rows не надо?
проверить есть ли строка
Alexei
или если одну строку, то QueryRow
Aleksandr
вернет ErrNoRows или nil
Alexei
если QueryRow - то вернет ErrNoRows, если строки нет
Aleksandr
если QueryRow - то вернет ErrNoRows, если строки нет
он возвращает Row без err. Вернемся к вопросу
Alexei
доки вообще никто не читает?
Anonymous
ошибку и после exec можно получить ведь, не надо обязательно результат получать. разве нет?
Aleksandr
доки вообще никто не читает?
слушай, ты вопрос прочел?
Alexei
if err = db.QueryRow("select slug where....", slug).Scan(&slug); err == sql.ErrNoRows { bla-bla-bla }
Anonymous
Ребята, давайте жить дружно!
Aleksandr
if err = db.QueryRow("select slug where....", slug).Scan(&slug); err == sql.ErrNoRows { bla-bla-bla }
мне не нужно сканировать ничего. мне нужно получить ошибку ErrNoRows. Вопрос прочитай еще раз
Alexei
слушай, ты вопрос прочел?
прочел, хз, что будет с потеряным rows, поскольку ты его не перебираешь в последнем Next не вызывается Close
Alexei
с Exec - не знаю, вернется ли ошибка
Alexei
МНТ же
Anonymous
_, err := repo.db.Exec( “…”) if err != nil { чем это не решение?
Alexei
тоже самое
Anonymous
что в exec писать?
тот же самый запрос, что и раньше
Anonymous
Вот это и интересно.
попробовать в for loop'е, посмотреть на жор коннектов/оперативы ))
Anonymous
точнее даже не так.
Anonymous
это и есть МНТ ))))
как расшифровывается?
Anonymous
_, err := repo.db.Exec( “…”) if err != nil { чем это не решение?
тут первый аргумент - это результат, который не надо сканить или закрывать, но в нем есть last_insert_id и rows_affected
Alexei
и да, в некоторых драйверах last id возвращает
Alexei
в pgsql, например, не возвращает )
Anonymous
в принципе их тоже можно включить
Alexei
в принципе их тоже можно включить
или Query с RETURNING id и скан его
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
Aleksandr
норм
Zloy-Dobry
Парни, прэд! А насоветуйте мне библиотечку для UI под мак?
Заур
Там вроде qt для голанга тоже был. Что-то такое видел
Alexei
там qt qml для голанга, вроде, без gui
Заур
Аа, видимо