Добавьте mutex и выполняйте проверку с возможной вставкой под одной блокировкой. Существующее значение возвращается без замены, даже если это пустая строка.
Практическая задача: разбор кода go
Добавьте mutex и выполняйте проверку с возможной вставкой под одной блокировкой. Существующее значение возвращается без замены, даже если это пустая строка.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
type SafeMap struct {
data map[string]string
}
func (s *SafeMap) GetOrCreate(key, value string) string {
}
Ответ
Добавьте mutex и выполняйте проверку с возможной вставкой под одной блокировкой. Существующее значение возвращается без замены, даже если это пустая строка.
Вариант поддерживает нулевое значение SafeMap:
import "sync"
type SafeMap struct {
mu sync.Mutex
data map[string]string
}
func (s *SafeMap) GetOrCreate(key, value string) string {
s.mu.Lock()
defer s.mu.Unlock()
if existing, ok := s.data[key]; ok {
return existing
}
if s.data == nil { s.data = make(map[string]string) }
s.data[key] = value
return value
}
Все остальные методы должны защищать data тем же mutex. Нельзя копировать SafeMap после начала использования. Разделение проверки и вставки на два независимо защищённых участка допустило бы конкурирующее создание.