Sergey
зачем ты здесь?
Max
чтобы скидывать ссылку на гугл, очевидно
Sergey
вместо тебя можно бота сделать, будет ссылку на гугл кидать при каждом вопросе
Sergey
тогда и смыла в этом чате не будет, очевидно
Max
хм, может я займусь этим ботом
Sergey
Если знаешь скажи
Max
будет
Sergey
почему размер структуры не совпадает с тем что записывается в файл
Max
ну, я же уже ответил..
Sergey
ну типа сам не знаешь… я понял
Sergey
подождем может кто то знает
Илья
променял sqlite на какой-то файлик, который может нормально не работать на других ос.....
Max
подождем может кто то знает
давай, а сколько ждать готов?
Sergey
понимаю что это связно с реализацией в каждой файловой системе
Sergey
но как тогда узнать размер для каждой фс?
Sergey
сделать предварительную запись в файл, прочитать количество байт? так что ли? )
Sergey
предварительно записать во временный файл одну структуру, посмотреть ее размер… все верно?
Юра (Юрий Александрович)
Я так и не понял, какие ожидания не совпадают с реальностью.
Sergey
смотри, есть структура размер можно посчитать: 8 + 8 + 8 + 1 + 8 = 33 байта такой же размер получается и в файле 33 байта но если взять методы для измерения размера структуры, то размер будет 40 байт
Sergey
Anonymous
Unsafe 🤨🤨🤨
Юра (Юрий Александрович)
А там случайно не применяется выравнивание адресов?
Юра (Юрий Александрович)
Ради эксперимента удали из структуры Action
Юра (Юрий Александрович)
структура должна стать размером 32 байта
Sergey
стало 32 байта…
Sergey
выравнивание по 8 байт?
Sergey
как тогда реальный размер структуры посчитать?
Илья
unsafe.Sizeof
Sergey
unsafe.Sizeof
https://t.me/golangl/77022
Sergey
пройтись в рекурсии по всем типам структуры и вручную считать что ли? )
Юра (Юрий Александрович)
выравнивание по 8 байт?
в 64-битной системе - да.
Sergey
есть две идеи.. первая сделать запись одной структуры во временный файл и посчитать размер… второй вариант рассчитать размер структуры в go (предложите способ)
Юра (Юрий Александрович)
первый вариант точно плохой.
Sergey
первый вариант точно плохой.
чем он плох если дальше я все равно работаю с стурктурами в файлах?
Юра (Юрий Александрович)
Юра (Юрий Александрович)
Вот тут есть нужный код (или очень похожий) https://groups.google.com/g/golang-nuts/c/Bq4c-1nvmCw/m/K0H1hSBVBgAJ
Юра (Юрий Александрович)
Я не могу сходу сказать, будет ли это правильно работать с типом Action, нужно проверить.
Sergey
да это отлично работает
Юра (Юрий Александрович)
чем он плох если дальше я все равно работаю с стурктурами в файлах?
Нарушение принципов проектирования. Функция по сути работающая с памятью (определяющая размер структуры) внезапно оказывается зависимой от пакета файлового ввода-вывода, разрешений на ввод-вывод и что-то вообще с диском творит.
Sergey
Юр, спасибо
Юра (Юрий Александрович)
Пожааалуйста :)
Sergey
Может кому то пригодится. Здесь метод Init(“data.db”) инициализирует файл для данных Add(item) добавляет в бд одну запись структуры Методы: DataLastYear() DataLastMonth() DataLastWeek() DataLastDay() возвращают последние элементы в соотвествии с заданным интервалом времени. У меня Add дергается каждую секунду, поэтому такие названия. Под себя можете спокойно измениить. Так же под себя можно поменять структуру. И бонусом ZipPath() метод вернет архивом все записи в виде текстового файла.
NU
можете напомнить как скомпилировать бинарник под линукс
Segmentation
Напомните, пжл, что такое программирование?
NU
Спасибо большое)
Maks
Это писать на языке компилятора/интерпретатора/транслятора/машины
Nikita
Ребят, доброго вечера Вопрос про слайсы и массивы, а точнее про gotcha их Как я понял, массивы - всё по классике си, это блок в памяти неразрывный и т.д. А вот когда мы хотим создать слайс на основе массива, то наш слайс - это, грубо говоря, наш старый массив (и указатель тот же), только теперь мы его можем расширять (допустим, при создании у нас len и cap по 10). И вот в этот момент, если мы вдруг будем как-то менять наш прошлый массив или же существующих слайс - то изменение в одном, породит изменение в другом, так как указатель-то на одну и ту же область памяти (да, знаю, что если при append наш cap маленький, то выделится новый кусок памяти) И теперь я задумался: значит, чтобы избежать подобных неприятностей и страховать себя,то является ли хорошим тоном, чтобы при создании слайса на основе существующего массива, мы должны сделать "глубокое копирование", то есть чтобы у них были разные указатели, соответственно,на разные ячейки памяти? То есть чтобы они, массив и слайс на основе массива, были "независимы" друг от друга
Илья
Ребят, доброго вечера Вопрос про слайсы и массивы, а точнее про gotcha их Как я понял, массивы - всё по классике си, это блок в памяти неразрывный и т.д. А вот когда мы хотим создать слайс на основе массива, то наш слайс - это, грубо говоря, наш старый массив (и указатель тот же), только теперь мы его можем расширять (допустим, при создании у нас len и cap по 10). И вот в этот момент, если мы вдруг будем как-то менять наш прошлый массив или же существующих слайс - то изменение в одном, породит изменение в другом, так как указатель-то на одну и ту же область памяти (да, знаю, что если при append наш cap маленький, то выделится новый кусок памяти) И теперь я задумался: значит, чтобы избежать подобных неприятностей и страховать себя,то является ли хорошим тоном, чтобы при создании слайса на основе существующего массива, мы должны сделать "глубокое копирование", то есть чтобы у них были разные указатели, соответственно,на разные ячейки памяти? То есть чтобы они, массив и слайс на основе массива, были "независимы" друг от друга
для "глобокого" копирования есть copy()
Nikita
Окей, может неправильно выразился Но я к тому, что, значит, перед работой со слайсом на основе массива, хорошим тоном будет сперва "перекопировать", чтобы были разные указатели памяти?
Илья
да
Nikita
да
Спасибо)
ILIA
Коллеги, вопрос. Есть идея сделать бинарь, который будет идти в интернет, скачивать последнею версию софта и запускаться. (думал так решить вопрос с обновлением.) Может быть есть у кого ссылка на гит, с подобным решением или расскажите, почему это не хорошо
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
Думаю такое в принципе не возможно сделать
Хотя ты прав, вот и ответ. Логика на Го, бинарь на С Или делать на го скачивание и запуск, а после того как программа выполнилась, удаление материнской программой.
ILIA
Ну мы же вроде сейчас находимся в чатике Го и про него говорим.
Да, я говорю, что технически это можно сделать, и вопрос был, а на го, это можно сделать? Буду искать. Статья на хабре - https://habr.com/ru/company/plesk/blog/532402/ Это про упаковку, что говорил.
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
хочешь ожидаемый результат -> делай явное приведение