Просмотр исходного кода

synchronize access to the cache

the docs say that access from multiple goroutines is undefined.
Lucas Stadler лет назад: 11
Родитель
Сommit
e76bc4639b
1 измененных файлов с 6 добавлено и 0 удалено
  1. 6 0
      go/favicon.go

+ 6 - 0
go/favicon.go

8
	"net/http"
8
	"net/http"
9
	"net/url"
9
	"net/url"
10
	"os"
10
	"os"
11
	"sync"
11
)
12
)
12
13
13
var faviconCache = make(map[string]string)
14
var faviconCache = make(map[string]string)
15
var lock sync.RWMutex
14
16
15
func main() {
17
func main() {
16
	http.HandleFunc("/favicon", HandleGetFavicon)
18
	http.HandleFunc("/favicon", HandleGetFavicon)
47
	} else {
49
	} else {
48
		host = parsed.Host
50
		host = parsed.Host
49
	}
51
	}
52
	lock.RLock()
50
	faviconUrl, cached := faviconCache[host]
53
	faviconUrl, cached := faviconCache[host]
54
	lock.RUnlock()
51
55
52
	if cached {
56
	if cached {
53
		return faviconUrl, nil
57
		return faviconUrl, nil
58
		return faviconUrl, err
62
		return faviconUrl, err
59
	}
63
	}
60
64
65
	lock.Lock()
61
	faviconCache[host] = faviconUrl
66
	faviconCache[host] = faviconUrl
67
	lock.Unlock()
62
	return faviconUrl, nil
68
	return faviconUrl, nil
63
}
69
}
64
70