@Duke565

Как конкурентно писать/читать данные в Go?

Добрый день.
Кто знает, как правильно работать со структурами данных в 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
}


Вопросы:
  1. Могу-ли я изменять содержимое детей, не изменяя указатель без блокировки Parent?
  2. Export нужен для копирования данных, потому что с ними будет длительная работа. Правильно-ли скопировал?
  3. Аргументы в функции без указателя копируются?
  • Вопрос задан
  • 462 просмотра
Решения вопроса 1
1) Можете. Вы же никак не модифицируете map.
2) Нужно инициализировать map
func (p *Parent) Export() (result map[string]Child) {
  result = make(map[string]Child)
  p.mu.Lock()
  defer p.mu.Unlock()

  for k, v := range p.Dict {
    result[k] = *v
  }

  return result
}

3) Да, копируются.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы