170 похожих чатов

Подскажите пожалуйста по стилю кода в Go. Вот у меня есть

файл, из которого я читаю имена и фамилии людей и добавляю в мапу при помощи функции func loadDataFromFile()
И есть аналогичная функция для записи всех объектов из мапы в файл saveMapDataToFile()

В Java я сделал бы класс с двумя статическими методами loadDataFromFile() и saveMapDataToFile(), ну и со статическим полем с мапой, с которой эти методы взаимодействуют.

Но такое ощущение, что в Go принято все это пихать в структуру. Так оно и есть? Просто если структура это аналог класса, то это избыточно, это же не множественный объект, я бы тут просто в отдельный файл методы и переменную с мапой положил.

16 ответов

29 просмотров
Михаил-Шевелев Автор вопроса

То есть стоит ли делать структуру FileSaver с полем мапа и двумя методами loadDataFromFile() и saveMapDataToFile() ? Или можно просто вынести методы с отдельный Go файл и вызвать их как будто это статические методы из джавы?

В го не "принято все это пихать в структуру", imo) в вашем уравнении, на мой взгляд, многовато неизвестных, для того, чтобы однозначно ответить на вопрос "как вам лучше будет".

Михаил-Шевелев Автор вопроса
Artem (☞゚ヮ゚)☞ Bortnikov
В го не "принято все это пихать в структуру", imo)...

Мне нужно будет обращаться к этой мапе для того, чтобы по имени получить фамилию. Вот из этого как раз исхожу при поиске решения. Еще непонятно, если делаю структуру и мне нужно будет к ней постоянно обращаться, норм ли, что я создам где-то переменную хранящую эту структуру и буду к ней обращаться

Реализуй два подхода и попробуй напиши для них параллельные тесты, тогда сразу поймешь, что в данном случаи будет удобно 😇

Михаил Шевелев
Мне нужно будет обращаться к этой мапе для того, ч...

Ну как минимум эта мапа должна лочиться мьютексом. А значит должна быть в какой-то структуре вместе с ним. И быть какой-то метод для запроса данных из мапы, который и будет защищён мьютексом.

Михаил Шевелев
Мне нужно будет обращаться к этой мапе для того, ч...

Тут ответ на вопрос скорее лежит со стороны тестов. Когда это будет статическая переменная, то все доступы к ней - это просто обращения к пакету и мапе внутри него. Если там вдруг станет не мапа, а слайс или бд, то все эти вызовы сломаются. Чтобы такое избежать лучше абстрагироваться от конкретного типа с помощью интерфейса. То есть туда, где эта мапа будет использоваться мы будем принимать не тип map, а какой-то интерфейс с нужными методами.

Andrew Popov
Ну как минимум эта мапа должна лочиться мьютексом....

По умолчанию, не надо встраивать mutex, если мы не абсолютно уверены что эта структура будет использоваться из под нескольких горутин.

да и к тому-же, речи о её мутации не было, она после чтения из файла остаётся иммутабельной, значит синхронизация не нужна

Roman Sharkov
По умолчанию, не надо встраивать mutex, если мы не...

Верно. Но зачем лезть в Го если работать в 1 поток? И это тогда звучит и правда как одноразовый скрипт, ради которого вообще нет смысла задумывать о том, как что делать. Главное чтобы работало. Но там человек привёл в пеример метод SaveToFile(), а значит логично, что она и дополняется во время исполнения. В любом случае, в более или менее серьёзном приложении хранить глобальную мапу - это странно...

Roman Sharkov
По умолчанию, не надо встраивать mutex, если мы не...

Вообще лучше не писать код, если мы не уверены, что его кто-то будет использовать 🤣

Andrew Popov
Верно. Но зачем лезть в Го если работать в 1 поток...

потому-что порой многопоточность не добавляет, а убавляет производительность. Не все задачи параллелизуемы.

А почему бы не реализовать две функции? А мапу хранить, например, в структуру вызывающего объекта?

Roman Sharkov
да и к тому-же, речи о её мутации не было, она пос...

Шла речь о чтении в мапу из файла И записи мапы в файл. Если исходить из ее иммутабельности, то смысл в записи в файл (если только не хочется плодить одинаковые файлы) теряется.

быть может мы получаем мапу из другого источника, условного HTTP запроса, и нам надо лишь записать её в файл в определённом формате. В таком случае мапа лишь 1 раз инициализируется и остаётся иммутабельной. Речь в изначальном вопросе шла лишь про проверку фамилии по имени, а это чтение и синхронизации не требует.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта