файл, из которого я читаю имена и фамилии людей и добавляю в мапу при помощи функции func loadDataFromFile()
И есть аналогичная функция для записи всех объектов из мапы в файл saveMapDataToFile()
В Java я сделал бы класс с двумя статическими методами loadDataFromFile() и saveMapDataToFile(), ну и со статическим полем с мапой, с которой эти методы взаимодействуют.
Но такое ощущение, что в Go принято все это пихать в структуру. Так оно и есть? Просто если структура это аналог класса, то это избыточно, это же не множественный объект, я бы тут просто в отдельный файл методы и переменную с мапой положил.
То есть стоит ли делать структуру FileSaver с полем мапа и двумя методами loadDataFromFile() и saveMapDataToFile() ? Или можно просто вынести методы с отдельный Go файл и вызвать их как будто это статические методы из джавы?
В го не "принято все это пихать в структуру", imo) в вашем уравнении, на мой взгляд, многовато неизвестных, для того, чтобы однозначно ответить на вопрос "как вам лучше будет".
Мне нужно будет обращаться к этой мапе для того, чтобы по имени получить фамилию. Вот из этого как раз исхожу при поиске решения. Еще непонятно, если делаю структуру и мне нужно будет к ней постоянно обращаться, норм ли, что я создам где-то переменную хранящую эту структуру и буду к ней обращаться
Реализуй два подхода и попробуй напиши для них параллельные тесты, тогда сразу поймешь, что в данном случаи будет удобно 😇
Ну как минимум эта мапа должна лочиться мьютексом. А значит должна быть в какой-то структуре вместе с ним. И быть какой-то метод для запроса данных из мапы, который и будет защищён мьютексом.
Тут ответ на вопрос скорее лежит со стороны тестов. Когда это будет статическая переменная, то все доступы к ней - это просто обращения к пакету и мапе внутри него. Если там вдруг станет не мапа, а слайс или бд, то все эти вызовы сломаются. Чтобы такое избежать лучше абстрагироваться от конкретного типа с помощью интерфейса. То есть туда, где эта мапа будет использоваться мы будем принимать не тип map, а какой-то интерфейс с нужными методами.
По умолчанию, не надо встраивать mutex, если мы не абсолютно уверены что эта структура будет использоваться из под нескольких горутин.
да и к тому-же, речи о её мутации не было, она после чтения из файла остаётся иммутабельной, значит синхронизация не нужна
Верно. Но зачем лезть в Го если работать в 1 поток? И это тогда звучит и правда как одноразовый скрипт, ради которого вообще нет смысла задумывать о том, как что делать. Главное чтобы работало. Но там человек привёл в пеример метод SaveToFile(), а значит логично, что она и дополняется во время исполнения. В любом случае, в более или менее серьёзном приложении хранить глобальную мапу - это странно...
Вообще лучше не писать код, если мы не уверены, что его кто-то будет использовать 🤣
потому-что порой многопоточность не добавляет, а убавляет производительность. Не все задачи параллелизуемы.
А почему бы не реализовать две функции? А мапу хранить, например, в структуру вызывающего объекта?
Шла речь о чтении в мапу из файла И записи мапы в файл. Если исходить из ее иммутабельности, то смысл в записи в файл (если только не хочется плодить одинаковые файлы) теряется.
быть может мы получаем мапу из другого источника, условного HTTP запроса, и нам надо лишь записать её в файл в определённом формате. В таком случае мапа лишь 1 раз инициализируется и остаётся иммутабельной. Речь в изначальном вопросе шла лишь про проверку фамилии по имени, а это чтение и синхронизации не требует.
Обсуждают сегодня