Goのセットアップとチュートリアル【4】
こんにちは、ナナオです。 前回の続きでチュートリアルをやっていこうと思います。 sync.Mutex データの複数書き込みに対応するための機能です。 Rustの場合Mutex<...>のような形で書かれますが、Goの場合は構造体の一プロパティとして定義するようです。 package main import ( "fmt" "sync" "time" ) // SafeCounter is safe to use concurrently. type SafeCounter struct { mu sync.Mutex v map[string]int } // Inc increments the counter for the given key. func (c *SafeCounter) Inc(key string) { c.mu.Lock() // Lock so only one goroutine at a time can access the map c.v. c.v[key]++ c.mu.Unlock() } // Value returns the current value of the counter for the given key. func (c *SafeCounter) Value(key string) int { c.mu.Lock() // Lock so only one goroutine at a time can access the map c.v. defer c.mu.Unlock() return c.v[key] } func main() { c := SafeCounter{v: make(map[string]int)} for i := 0; i < 1000; i++ { go c.Inc("somekey") } // 一秒待つ(ゴルーチンのループを待つ) // ちなみに実務ではこんなは書き方しない time.Sleep(time.Second) fmt.Println(c.Value("somekey")) } 理解のためにこれをチャンネルで書き換えたコードが以下の通りです。 ...