Я тестирую параллелизм приращения itemID
в функции обработчика ниже, и иногда приращение пропускает значение (пример: 4, 6, 7, ... пропущенный идентификатор 5).
func proxyHandler() http.Handler {
var itemID int32
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
proxy := httputil.NewSingleHostReverseProxy(url)
proxy.ModifyResponse = func(res *http.Response) error {
item := Item{
ID: int(atomic.AddInt32(&itemID, 1)),
}
items.Add(item)
return nil
}
proxy.ServeHTTP(rw, req)
})
}
Я решил это с помощью Mutex:
func proxyHandler() http.Handler {
itemID := 0
mux := sync.Mutex{}
return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
proxy := httputil.NewSingleHostReverseProxy(url)
proxy.ModifyResponse = func(res *http.Response) error {
mux.Lock()
itemID++
item := Item{
ID: itemID,
}
items.Add(item)
mux.Unlock()
return nil
}
proxy.ServeHTTP(rw, req)
})
}
Я бы хотел понять, почему атомарное добавление не сработало так, как я ожидал, то есть генерировать последовательное значение без пробелов.