如果只需要一个同步计数器,那么使用
sync.Mutex就是规范的解决方案。sync / atomic程序包仅应用于低级内容或测量到严重的性能问题时使用。
type Counter struct { mu sync.Mutex x int64}func (c *Counter) Add(x int64) { c.mu.Lock() c.x += x c.mu.Unlock()}func (c *Counter) Value() (x int64) { c.mu.Lock() x = c.x c.mu.Unlock() return}func makeHomeHandler() func(c http.ResponseWriter, r *http.Request) { var views Counter return func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Counting %s, %d so far.", r.URL.Path[1:], views.Value()) views.Add(1) }}对于您的特定问题,建议您定义一个满足http.Handler接口的新类型,而不是返回闭包。这看起来也更简单:
type homeHandler struct { mu sync.Mutex views int64}func (h *homeHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { h.mu.Lock() defer h.mu.Unlock() fmt.Fprintf(w, "Counting %s, %d so far.", r.URL.Path[1:], h.views) h.views++}func init() { http.Handle("/", new(homeHandler))}


