Добрый день.
Кто знает, как правильно работать со структурами данных в Go, когда к ним конкурентный доступ (чтение/запись)?
Работаю с Go несколько лет, но до сих пор ясного понимания нет...
Я знаю про мьютексы (sync.Mutex) и в тривиальных вещах, вроде понимаю, как безопасно работать, но как быть с этим случаем?
type Child struct {
name string
}
type Parent struct {
mu sync.Mutex
Dict map[string]*Child
}
func (p *Parent) Add(child *Child) {
p.mu.Lock()
defer p.mu.Unlock()
p.Dict[child.name] = child
}
func (p *Parent) Export() (result map[string]Child) {
p.mu.Lock()
defer p.mu.Unlock()
for k, v := range p.Dict {
result[k] = *v
}
return result
}
Вопросы:- Могу-ли я изменять содержимое детей, не изменяя указатель без блокировки Parent?
- Export нужен для копирования данных, потому что с ними будет длительная работа. Правильно-ли скопировал?
- Аргументы в функции без указателя копируются?