背景
假设我们要开发生产者-消费者模型的代码,一个routine负责生产数据,一个routine负责消费数据,具体代码如下:
错误代码
type MsgStru struct {
msg []int
}
var msgChan chan MsgStru
func sendMsg() {
buf := make([]int, 10)
for i := 0; i < 10; i++ {
buf[0] = i
tmp := MsgStru{msg: buf[:1]}
fmt.Printf("send:%+v\n", tmp)
msgChan <- tmp
}
fmt.Println("finish send")
}
func recvMsg() {
for {
tmp, _ := <-msgChan
fmt.Printf("recv:%+v\n", tmp)
}
}
func main() {
msgChan = make(chan MsgStru, 10)
go sendMsg()
time.Sleep(1 * time.Second)
recvMsg()
}
期望的输出应该是顺序打印0到9,但是实际打印呢?
send:{
msg:[0]}
send:{
msg:[1]}
send:{
msg:[2]}
send:{
msg:[3]}
send:{
msg:[4]}
send:{
msg:[5]}
send:{
msg:[6]}
send:{
msg:[7]}
send:{
msg:[8]}
send