mirror of
https://github.com/teivah/100-go-mistakes.git
synced 2026-06-23 01:47:08 +08:00
66 lines
1.1 KiB
Go
66 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
func main() {
|
|
c := Cache{
|
|
balances: make(map[string]float64),
|
|
}
|
|
c.AddBalance("1", 1.0)
|
|
c.AddBalance("2", 3.0)
|
|
fmt.Println(c.AverageBalance1())
|
|
fmt.Println(c.AverageBalance2())
|
|
fmt.Println(c.AverageBalance3())
|
|
}
|
|
|
|
type Cache struct {
|
|
mu sync.RWMutex
|
|
balances map[string]float64
|
|
}
|
|
|
|
func (c *Cache) AddBalance(id string, balance float64) {
|
|
c.mu.Lock()
|
|
c.balances[id] = balance
|
|
c.mu.Unlock()
|
|
}
|
|
|
|
func (c *Cache) AverageBalance1() float64 {
|
|
c.mu.RLock()
|
|
balances := c.balances
|
|
c.mu.RUnlock()
|
|
|
|
sum := 0.
|
|
for _, balance := range balances {
|
|
sum += balance
|
|
}
|
|
return sum / float64(len(balances))
|
|
}
|
|
|
|
func (c *Cache) AverageBalance2() float64 {
|
|
c.mu.RLock()
|
|
defer c.mu.RUnlock()
|
|
|
|
sum := 0.
|
|
for _, balance := range c.balances {
|
|
sum += balance
|
|
}
|
|
return sum / float64(len(c.balances))
|
|
}
|
|
|
|
func (c *Cache) AverageBalance3() float64 {
|
|
c.mu.RLock()
|
|
m := make(map[string]float64, len(c.balances))
|
|
for k, v := range c.balances {
|
|
m[k] = v
|
|
}
|
|
c.mu.RUnlock()
|
|
|
|
sum := 0.
|
|
for _, balance := range m {
|
|
sum += balance
|
|
}
|
|
return sum / float64(len(m))
|
|
}
|