変数の値がgoroutine間で同じになってしまう。
初めまして。
現在goを勉強しておりまして、goroutineに関して勉強しています。
以下のようにmapにいくつかstringのキーを入れて、値はboolでフラグ管理しております。
値がtrueの時はsleep処理を入れて、falseのときはsleep無しの処理をしたいと思っております。
しかし、以下実行しますと、mapのキー値がいくつか被ってしまいます。
試しに変数のアドレスを確認すると、同じアドレスになっている場合があるのですが、なぜ同じアドレスになっているのでしょうか?
また、どのようにしたら被らないようにmapに入っている全ての値を出力することができるようになりますでしょうか。
ソース
package main
import (
"fmt"
"time"
)
func goroutine(name string) {
for {
select {
case <-sleep:
fmt.Printf("---------------(sleep)name = %s, name of address = %p\n", name, &name)
time.Sleep(5 * time.Second)
fmt.Printf("---------------wake up name = %s", name)
case <-start:
fmt.Printf("---------------(start)name = %s, name of address = %p\n", name, &name)
}
}
}
var sleep chan bool
var start chan bool
func main() {
sleep = make(chan bool)
start = make(chan bool)
names := make(map[string]bool)
names["a"] = false
names["b"] = false
names["c"] = false
names["d"] = true
names["e"] = false
for k, v := range names{
if v {
go goroutine(k)
sleep <- true
} else {
go goroutine(k)
start <- true
}
}
time.Sleep(1000 * time.Second)
}
出力結果
# go run main.go
---------------(start)name = a, name of address = 0xc00006e1c0
---------------(start)name = c, name of address = 0xc0000a2000
---------------(sleep)name = c, name of address = 0xc0000a2000
---------------(start)name = e, name of address = 0xc0000a2020
---------------(start)name = a, name of address = 0xc00006e1c0
---------------wake up name = c