Sergey
зачем ты здесь?
Max
чтобы скидывать ссылку на гугл, очевидно
Sergey
вместо тебя можно бота сделать, будет ссылку на гугл кидать при каждом вопросе
Sergey
тогда и смыла в этом чате не будет, очевидно
Max
хм, может я займусь этим ботом
Sergey
Если знаешь скажи
Max
будет
Sergey
почему размер структуры не совпадает с тем что записывается в файл
Max
ну, я же уже ответил..
Max
Sergey
ну типа сам не знаешь… я понял
Sergey
подождем может кто то знает
Илья
променял sqlite на какой-то файлик, который может нормально не работать на других ос.....
Sergey
Sergey
понимаю что это связно с реализацией в каждой файловой системе
Sergey
но как тогда узнать размер для каждой фс?
Sergey
сделать предварительную запись в файл, прочитать количество байт? так что ли? )
Sergey
предварительно записать во временный файл одну структуру, посмотреть ее размер… все верно?
Юра (Юрий Александрович)
Я так и не понял, какие ожидания не совпадают с реальностью.
Sergey
смотри, есть структура
размер можно посчитать: 8 + 8 + 8 + 1 + 8 = 33 байта
такой же размер получается и в файле 33 байта
но если взять методы для измерения размера структуры, то размер будет 40 байт
Sergey
Anonymous
Юра (Юрий Александрович)
А там случайно не применяется выравнивание адресов?
Юра (Юрий Александрович)
Ради эксперимента удали из структуры Action
Юра (Юрий Александрович)
структура должна стать размером 32 байта
Sergey
Sergey
стало 32 байта…
Sergey
выравнивание по 8 байт?
Sergey
как тогда реальный размер структуры посчитать?
Илья
unsafe.Sizeof
Sergey
пройтись в рекурсии по всем типам структуры и вручную считать что ли? )
Sergey
есть две идеи.. первая сделать запись одной структуры во временный файл и посчитать размер… второй вариант рассчитать размер структуры в go (предложите способ)
Юра (Юрий Александрович)
первый вариант точно плохой.
Юра (Юрий Александрович)
Юра (Юрий Александрович)
Вот тут есть нужный код (или очень похожий)
https://groups.google.com/g/golang-nuts/c/Bq4c-1nvmCw/m/K0H1hSBVBgAJ
Юра (Юрий Александрович)
Я не могу сходу сказать, будет ли это правильно работать с типом Action, нужно проверить.
Sergey
Sergey
да это отлично работает
Sergey
Sergey
Юр, спасибо
Юра (Юрий Александрович)
Пожааалуйста :)
Sergey
Может кому то пригодится. Здесь метод Init(“data.db”) инициализирует файл для данных
Add(item) добавляет в бд одну запись структуры
Методы:
DataLastYear()
DataLastMonth()
DataLastWeek()
DataLastDay()
возвращают последние элементы в соотвествии с заданным интервалом времени. У меня Add дергается каждую секунду, поэтому такие названия. Под себя можете спокойно измениить.
Так же под себя можно поменять структуру.
И бонусом ZipPath() метод вернет архивом все записи в виде текстового файла.
Vladislav
NU
можете напомнить как скомпилировать бинарник под линукс
Segmentation
Напомните, пжл, что такое программирование?
Anonymous
Anonymous
NU
Спасибо большое)
NU
Maks
Это писать на языке компилятора/интерпретатора/транслятора/машины
Nikita
Ребят, доброго вечера
Вопрос про слайсы и массивы, а точнее про gotcha их
Как я понял, массивы - всё по классике си, это блок в памяти неразрывный и т.д. А вот когда мы хотим создать слайс на основе массива, то наш слайс - это, грубо говоря, наш старый массив (и указатель тот же), только теперь мы его можем расширять (допустим, при создании у нас len и cap по 10). И вот в этот момент, если мы вдруг будем как-то менять наш прошлый массив или же существующих слайс - то изменение в одном, породит изменение в другом, так как указатель-то на одну и ту же область памяти (да, знаю, что если при append наш cap маленький, то выделится новый кусок памяти)
И теперь я задумался: значит, чтобы избежать подобных неприятностей и страховать себя,то является ли хорошим тоном, чтобы при создании слайса на основе существующего массива, мы должны сделать "глубокое копирование", то есть чтобы у них были разные указатели, соответственно,на разные ячейки памяти? То есть чтобы они, массив и слайс на основе массива, были "независимы" друг от друга
Илья
Ребят, доброго вечера
Вопрос про слайсы и массивы, а точнее про gotcha их
Как я понял, массивы - всё по классике си, это блок в памяти неразрывный и т.д. А вот когда мы хотим создать слайс на основе массива, то наш слайс - это, грубо говоря, наш старый массив (и указатель тот же), только теперь мы его можем расширять (допустим, при создании у нас len и cap по 10). И вот в этот момент, если мы вдруг будем как-то менять наш прошлый массив или же существующих слайс - то изменение в одном, породит изменение в другом, так как указатель-то на одну и ту же область памяти (да, знаю, что если при append наш cap маленький, то выделится новый кусок памяти)
И теперь я задумался: значит, чтобы избежать подобных неприятностей и страховать себя,то является ли хорошим тоном, чтобы при создании слайса на основе существующего массива, мы должны сделать "глубокое копирование", то есть чтобы у них были разные указатели, соответственно,на разные ячейки памяти? То есть чтобы они, массив и слайс на основе массива, были "независимы" друг от друга
для "глобокого" копирования есть copy()
Nikita
Окей, может неправильно выразился
Но я к тому, что, значит, перед работой со слайсом на основе массива, хорошим тоном будет сперва "перекопировать", чтобы были разные указатели памяти?
Илья
да
Nikita
Vladislav
ILIA
ILIA
Коллеги, вопрос.
Есть идея сделать бинарь, который будет идти в интернет, скачивать последнею версию софта и запускаться. (думал так решить вопрос с обновлением.) Может быть есть у кого ссылка на гит, с подобным решением или расскажите, почему это не хорошо
Andrey
ILIA
ILIA
И потом его запускал отдельно?
ILIA
Можно ли не сохраняя его на диск, запустить из под бинаря который запущен?
Andrey
Ты именно скачивал бинарь?
Там было сложнее. Из файла бралась необходимая версия программы, если ее нет на компе юзера, она выкачивалась(использую знания о ОС юзера, плюс релизы были в архиве все, и их надо было распаковать), после того как это сделано, нужно было перехватить все аргументы командной строки и переправить в нужную версию, и результат вернуть обратно в материнский
ILIA
Там было сложнее. Из файла бралась необходимая версия программы, если ее нет на компе юзера, она выкачивалась(использую знания о ОС юзера, плюс релизы были в архиве все, и их надо было распаковать), после того как это сделано, нужно было перехватить все аргументы командной строки и переправить в нужную версию, и результат вернуть обратно в материнский
Очень похоже, над задачей, которая на хабре была описана, что использовалось в качестве доставки запакованная версия.
Если интересно, найду ссылку.
ILIA
Andrey
ILIA
Думаю такое в принципе не возможно сделать
Почему?
На C - можно
In C and assuming Linux, you can change the protection of a memory region by means of the mprotect() system call, so that it can be executed (i.e.: turn a data region into a code region). After that, you could execute that region of memory by jumping into it.
ILIA
Думаю такое в принципе не возможно сделать
Хотя ты прав, вот и ответ. Логика на Го, бинарь на С
Или делать на го скачивание и запуск, а после того как программа выполнилась, удаление материнской программой.
Andrey
Emin Zalaev
ILIA
Вова
Nikita
Вопрос насчет неявного преобразования из целочисленного и плавающий
Пример на скрине
В это примере тип у c будет int
Но если в 10 строке вместо перменных a и b я напишу числа 5 и 3, к примеру, то тип у переменной c уже будет float64
Как это работает? Почему в первом случае (как на скрине) итоговый тип не кастуется к float64, ведь у нас есть литерал дробный 2.0?
А если я поставлю 2.5, то вообще ошибку выдаст Invalid operation: (a + b) / 2.5 (cannot convert the constant 2.5 to the type int)
Разве тут не главенство того, что если один с плавающей, то результат итоговой переменной тоже с плавающей?
Vladislav
хочешь ожидаемый результат -> делай явное приведение