博客:http://www.cnblogs.com/linguanh/)
错误欢迎指出,只要你跟着敲完这17个例子,channel的基础绝对可以掌握!
函数并提供它们某种传值交流的机制。
分类:
done := make(chan )
done1 := make(chan ,)
}
错误 deadlock,阻死 main 进程
done := make(chan done<-
<-done
println( }
错误 deadlock,阻死 main 进程
done := make(chan done<-
println( }
错误 deadlock,阻死 main 进程
done := make(chan <-done 输出,前面没有输入语句,done 是 empty 的,所以一直等待输入
println( }
done := make(chan <-done
println( 输出:
}
done := make(chan println(输出哦)
done<- 输出,见 test3 的结论
println(输出 <-done
println( }
done := make(chan println(输出哦 done<-
println(输出 <-done
time.Sleep(time.Second * )
println( 输出:
输出哦
内容输出,
}
done := make(chan done<-
println(输出,除非 <-done 执行
<-done 输出完成之前,那么上面的语句将会走通
println( 输出:
输出,除非 <-done 执行
}
done := make(chan done<-
println(输出,除非 <-done 执行 println( <-done 输出完成之后
输出:
输出,除非 <-done 执行
}
done := make(chan 关闭了的,不能再往里面输入值 */
<-done 关闭 channel 了,不会阻死
println( }
done := make(chan 关闭了的,不能再往里面输入值 */
<-done 关闭 channel 了,不会阻死
println( }
done := make(chan , done<-
<- println( }
done := make(chan ,
<-done
println( }
done := make(chan , done<-
done<-
println( }
done := make(chan , done<-
println( }
输出来不及,因为main已经跑完了,所以延时一会,等待 go routine
done := make(chan ,
println(输出哦 done<-
println(输出哦 <- println(输出不了了 time.Sleep(time.Second * ) 输出也有可以输出,routine 调度
println( 输出:
输出哦
输出哦
输出来不及,
}
func getMessagesChannel(msg ,delay time.Duration) <-chan c := make(chan i := ; i <= ; i++ c <- fmt.Sprintf( time.Sleep(time.Millisecond * delay)
c1 := getMessagesChannel(, c2 := getMessagesChannel(, c3 := getMessagesChannel(,
输出 c1 然后是 c2 最后是 c3
i := ; i <= ; i++ 提取一轮,共三轮
println(<-c1)
println(<-c2)
println(<-c3)
输出,因为
函数的延时 在 输入值之后,在第二轮及其之后
修改:如果把 getMessagesChannel 里面的延时,放在输入值之前,那么 c3 总是等待 5秒 后输出
}
修改的,复杂演示例,多channel 的选择,延时在输入之后的情况
修改的,复杂演示例子
c1 := getMessagesChannel(, c2 := getMessagesChannel(, c3 := getMessagesChannel(,
输出,而且,互不限制
i := ; i <= ; i++ msg := <- msg := <- msg := <-
输出,“第一”,“第二”,“第三”,都有,而且
随机顺序输出,因为协程的调度,第4,5,6次,由于“第二”只延时 500ms,
输出,然后是“第一”,此时“第三”还不能输出,
输出5次,再过 500ms,"第三"的5秒还没走完,所以继续输出"第一",
输出。至此,"第一"和"第二"已经
输出,9-7 = 2,剩下两个是 "第三"。此时,距离首次的 5000ms 完成,
输出,再过5秒,最后一次"第三输出"
}