初めまして。
現在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