Нить сохранить карту в текстовом шаблоне - PullRequest
0 голосов
/ 26 марта 2020

Я написал потокобезопасную карту, используя RWMutex. Вы можете увидеть код ниже.


type SyncMap struct {
    sync.RWMutex
    db map[string]interface{}
}

func NewSyncMap() *SyncMap {
    ctx := new(SyncMap)
    ctx.Clear()
    return ctx
}

func (ctx *SyncMap) Set(key string, value interface{}) {
    ctx.Lock()
    ctx.db[key] = value
    ctx.Unlock()
}

func (ctx *SyncMap) Get(key string) interface{} {
    ctx.RLock()
    v := ctx.db[key]
    ctx.RUnlock()
    return v
}

func (ctx *SyncMap) Delete(key string) {
    ctx.Lock()
    delete(ctx.db, key)
    ctx.Unlock()
}

И после того, как мне нужно выполнить template.Template и поместить туда эту карту. У меня есть два варианта:

  1. Сделать полную копию карты (не мое представление о веселье)
  2. Просто поместите ссылку на Map.db внутри
func (ctx *SyncMap) Map() map[string]interface{} {
    return ctx.db
}

Но безопасен ли он для чтения?

1 Ответ

1 голос
/ 27 марта 2020

Доступ к карте небезопасен, только когда происходят обновления. Пока все программы только читают - ищут элементы на карте, включая итерацию по ней с помощью цикла for - и не изменяют карту, назначая элементам или удаляя, они могут безопасно получить доступ к карте одновременно без синхронизации. https://golang.org/doc/faq#atomic_maps

Предоставление внутренней карты снимает защиту, которую вы реализовали. Тем не менее, я думаю, что вы можете вызывать методы вашего типа SyncMap в шаблонах вместо доступа к внутренней карте.

Вы уже рассматривали возможность использования других типов, подобных этому? https://golang.org/pkg/sync/#Map

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...