Anton
тут пока не знаю, как это будет работать
Anton
я передаю не только файл
Илья
GetBody defines an optional func to return a new copy of Body. It is used for client requests when a redirect requires reading the body more than once. Use of GetBody still requires setting Body
Илья
а, у тебя же файл, облом
Anton
угу)
Anton
я смотрел на это уже
Anton
ну во первых make([]byte, 1024) создает 1024 пустых значения, нужно make(...., 0 1024)
я не даун, ахах, там ниже есть уже моя строчка с readBytes, там все корректно!
Anton
а то илья фокс разочаруется во мне
Anton
:cattoCry:
Илья
https://pkg.go.dev/mime/multipart#File тут есть ReaderAt
anhckie
и под капотом там фастшттп, в тестах которого я нашел, что подставляется nil - потому и решил с ним тоже попробовать
anhckie
вот еще раз полный код приложу, для удобства. handler.Get("test2", func(c *fiber.Ctx) error { a := fiber.AcquireAgent() log.Println("start") var res []byte code, body, err := a.Get(res, "http://google.com/foo/bar") // ЗДЕСЬ ПАДАЕМ log.Println(err) log.Println("get" + string(body)) log.Println(code) log.Println("end") return c.SendString("ok") })
Patamen
вот еще раз полный код приложу, для удобства. handler.Get("test2", func(c *fiber.Ctx) error { a := fiber.AcquireAgent() log.Println("start") var res []byte code, body, err := a.Get(res, "http://google.com/foo/bar") // ЗДЕСЬ ПАДАЕМ log.Println(err) log.Println("get" + string(body)) log.Println(code) log.Println("end") return c.SendString("ok") })
Попробуйте тогда засетить клиента для данный приколдесов var res []byte client := fiber.AcquireClient() agent := client.Get("http://google.com") code, body, err := agent.Get(res, "http://google.com/foo/bar") if err != nil { return err } fmt.Println(code) fmt.Println(string(body))
anhckie
ага, вот так работает. и гет-, и пост-запросы!
anhckie
почему об этом в доке не писать..(
anhckie
а вам спасибище большущее ))
Andrey
почему об этом в доке не писать..(
https://docs.gofiber.io/api/client#agent
Andrey
вот пример как с агентом работать же
anhckie
смотрю в книгу - вижу фигу. это про меня сегодня, жесть
Илья
неееееееет
anhckie
неееееееет
что за крик души?)
🇷🇺 Vladimir
что за крик души?)
наверно с курсов выгнали
Robert
Всем привет, пишу уже с криком о помощи)) Кейс: Имеется приложение (предположительно на С/С++), которое крутится на винде и подтягивает к себе кучу .dll файлов. Доступа к исходникам этого приложения у нас нет. Задача написать небольшой драйвер по образу и подобию старого .dll, но на Go. Ход работы и суть проблемы: в гошную функцию из этого приложения передается строка типа char*, т.е. указатель, нужно по этому указателю вписать некую результирующую строку. Как нам сказали, память уже выделена, т.е. с гошной стороны никакого малока делать не нужно, только вписать результат. В результате возникает Access violation с значением указателя по которому пытаемся писать. Затем мы написали аналогичную функцию на С++ и собрали всё как .dll соответственно, которая также пишет результат в строку-входной параметр, итог: всё работает, выводили в лог указатель, он отличается от того, что передается в гошную функцию. Выглядит это, словно какой-то сдвиг в областях памяти при подкачиванти плюсовой и гошной .dll'ки. Кто-то знает об этом что-нибудь?)
Robert
Также я написал простенький вызыватель .dll на С и все отлично работает, все чётко стыкуется с гошной либой
Robert
Отличие, что линковка в данном случае у меня происходила на этапе компиляции, а на проде она происходит в рантайме
NU
как сбилдить код по арм?
NU
ой сорри, да
Anonymous
как сбилдить код по арм?
GOOS=ваша_ос GOARCH=arm64 go build
NU
спс
Alexandr🇷🇺
https://habr.com/ru/post/249449/
Илья
Всем привет, пишу уже с криком о помощи)) Кейс: Имеется приложение (предположительно на С/С++), которое крутится на винде и подтягивает к себе кучу .dll файлов. Доступа к исходникам этого приложения у нас нет. Задача написать небольшой драйвер по образу и подобию старого .dll, но на Go. Ход работы и суть проблемы: в гошную функцию из этого приложения передается строка типа char*, т.е. указатель, нужно по этому указателю вписать некую результирующую строку. Как нам сказали, память уже выделена, т.е. с гошной стороны никакого малока делать не нужно, только вписать результат. В результате возникает Access violation с значением указателя по которому пытаемся писать. Затем мы написали аналогичную функцию на С++ и собрали всё как .dll соответственно, которая также пишет результат в строку-входной параметр, итог: всё работает, выводили в лог указатель, он отличается от того, что передается в гошную функцию. Выглядит это, словно какой-то сдвиг в областях памяти при подкачиванти плюсовой и гошной .dll'ки. Кто-то знает об этом что-нибудь?)
а как вы записываете строку через го?
Robert
ой, кучу всего пробовали, весь стак по факту
Robert
но в итоговой версии через C.strcpy
Robert
не думаю, что это проблема, потому что С Сишным приложением для тестов нормально отработало и все записало
Илья
ой, кучу всего пробовали, весь стак по факту
не пробовали header := reflect.SliceHeader{ Data: ваш_*char, Len: длина, Cap: длина, } slice := *(*[]byte)(unsafe.Pointer(&header)) copy(slice, []byte(строка))
Илья
но в итоговой версии через C.strcpy
This function only works with C style strings and not C++ style strings i.e. it only works with strings of type char str[]; and not string s1; which are created using standard string data type available in C++ and not C. возможно чем-то поможет
Артем
Всем привет. Подскажите, пожалуйста, для работы программы на го нужен gcc, еще разные сишные либы (libvips и др..). Собираю докерфайл, если делать без мультистейджа, то выходит ~1.5 гига, что достаточно многовато) (с +- мультистейджем, который я придумал, выходит Поделитесь, если кто знает, как быть? В идеале, что бы на 1 стейдже все либы скачать, сбилдить гошный файл, как то включить в бинарь все либы или что-то ткаое и просто во 2м стейдже бинарь запустить. Могу поделиться докерфайлом
Артем
это понятно, но нужны либы, си компайлер и еще пара штук
Vladislav
а си компайлер зачем?
Vladislav
скомпилированный бинарь и без него запустится
Vladislav
а либы скопировать так же как артефакт сборки или так же установить
Артем
там большая либа и у нее куча зависимостей
Vladislav
ты ищешь способ как сделать правильно или оправдания почему не делать правильно?
Vladislav
со вторым не помогу, извини
Артем
сейчас, секунду
Артем
вот смотрите, на 1 стейдже ставлю голанг, си компайлер и сами либы. В гошной программе у меня библиотека на го, которая использует сишные библиотеки. Какие шаги дальше?
Maks
Копирнуть в него нужные либы и исходники
Vladislav
Копирнуть в него нужные либы и исходники
или ещё лучше нужные либы так же из пакетов в конечной системе поставить, если они ставятся из пакета
Maks
Далее билдишь в директорию
Артем
Копирнуть в него нужные либы и исходники
спасибо, а что вы имеете в виду под 'копирнуть в него' , в кого?
Vladislav
чуть многостадийного билда в том, что вы в контейнер следующей стадии копируете артифакты предыдущей стадии
Vladislav
а контейнер предыдущей стадии оставляете позади, отбрасываете
Артем
я понимаю суть мультистейджа, но не понимаю как мне тучу каких то .c и .h файлов не пойми откуда сбилдить 'куда-то'
Vladislav
а зачем копировать .c и .h файлы
Артем
скомпилировать
Vladislav
тебе уже скомпилированное надо скопировать в конечный контейнер
Артем
вот смотрите, https://packages.debian.org/ru/sid/libvips42, пакет и в нем куча еще зависимостей. Ставлю это через apt install. Он сам куда надо встает и в path тоже. Что мне с кучей этих файлов делать, я не понимаю вобще..
Vladislav
на первой стадии компилите бинарь
Артем
гошный бинарь?
Vladislav
копируете во вторую стадию
Артем
верно ведь
Vladislav
гошный, да
Vladislav
должно срастись всё
Артем
я еще раз сейчас попробую так сделать, но в прошлый раз ругался, что не хватает shared-library
Артем
минутку, попробую. Спасибо
Артем
Да, не хватает файла какого-то
Артем
Артем
щас попробую поискать через find, где он, если поставить libvips
Vladislav
щас попробую поискать через find, где он, если поставить libvips
так надо во вторую стадию поставить libvips42
Vladislav
ну или действительно .so скопировать
Артем
а лол. Да, так запускалось все. Но контейнер большеват был. Сейчас еще раз соберу так и посмотрю. Думаю +- 50-100мб можно освободить, убрав кеши
Артем
кстати, так не собралось. На 1 стейдж надо все-таки libvips-dev
Vladislav
а вы читаете, что я пишу?
Vladislav
я говорю, что при сборке ставим -dev