goroutine 小问题

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()
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值