Singleflight решает проблему thundering herd: при промахе кеша все горутины идут за данными одновременно. Пакет golang.org/x/sync/singleflight гарантирует, что для одного ключа выполняется одна функция, остальные ждут.
var group singleflight.Group
func getData(key string) (string, error) {
v, err, _ := group.Do(key, func() (interface{}, error) {
return fetchFromBackend(key)
})
if err != nil { return "", err }
return v.(string), nil
}Третий возвращаемый параметр shared (bool) показывает, получил ли вызывающий результат от чужого вызова.