goroutine在使用channel同步和通信時,因爲變量的共享訪問特性,需要注意goroutine訪問的變量是否被修改。
如下代碼,看似合理,實際上因爲i在main routine中已經被修改,會出現index越界訪問異常。
package main
import (
"fmt"
"strconv"
"time"
)
func main() {
const MAX = 3
cs := make([]chan string, MAX)
for i := 0; i < MAX; i++ {
fmt.Println("count i=", i)
cs[i] = make(chan string)
go func() {
for {
cs[i] <- "sender:" + strconv.Itoa(i)
time.Sleep(time.Millisecond * 500)
/////fmt.Println(<-cs[i])
}
}()
}
go func() {
for {
select {
case msg1 := <-cs[0]:
fmt.Println(msg1)
case msg2 := <-cs[1]:
fmt.Println(msg2)
case msg3 := <-cs[2]:
fmt.Println(msg3)
case <-time.After(time.Second):
//fmt.Println("timeout reading ")
default:
//fmt.Println("No channel ready")
}
}
}()
fmt.Scanln()
}