在win10下建设网站,网站建设意见,建设织梦网站模板,国外app开发公司文章目录 扇出模式reflectSelect 方式 扇出模式 
有扇入模式#xff0c;就有扇出模式#xff0c;扇出模式是和扇入模式相反的。扇出模式只有一个输入源 Channel#xff0c;有多个目标 Channel#xff0c;扇出比就是 1 比目标 Channel 数的值#xff0c;经常用在设计模式中… 文章目录 扇出模式reflectSelect 方式    扇出模式 
有扇入模式就有扇出模式扇出模式是和扇入模式相反的。扇出模式只有一个输入源 Channel有多个目标 Channel扇出比就是 1 比目标 Channel 数的值经常用在设计模式中的观察者模式中观察者设计模式定义了对象间的一种一对多的组合关系。这样一来一个对象的状态发生变化时所有依赖于它的对象都会得到通知并自动刷新。在观察者模式中数据变动后多个观察者都会收到这个变更信号。下面是一个扇出模式的实现。从源 Channel 取出一个数据后依次发送给目标 Channel。在发送给目标 Channel 的时候可以同步发送也可以异步发送 
// 扇出模式只有一个输入源 Channel有多个目标 Channel扇出比就是 1 比目标 Channel 数的值
func fanOut(ch -chan interface{}, out []chan interface{}, async bool) {go func() {defer func() { //退出时关闭所有的输出chanfor i : 0; i  len(out); i {close(out[i])}}()for v : range ch { // 从输入chan中读取数据v : v // 局部变量 v以便在循环内部的闭包中使用for i : 0; i  len(out); i {i : i // 一个局部变量 i以便在循环内部的闭包中使用if async {go func() {out[i] - v // 放入到输出chan中,异步方式}()} else {out[i] - v // 放入到输出chan中同步方式}}}}()}reflectSelect 方式 
// 实现扇出模式的反射方式,将数据从一个通道发送到多个目标通道
func fanOutReflect2(ch -chan interface{}, out []chan interface{}) {// 输入通道输出通道同时在一个cases 中cases : make([]reflect.SelectCase, len(out)1)// Create a case for the input channel// 接收通道监听有数据即可发送cases[0]  reflect.SelectCase{Dir:  reflect.SelectRecv, // case -Chan: 从一个通道发出Chan: reflect.ValueOf(ch),}// Create cases for the output channels// 发送通道监听for i : 0; i  len(out); i {cases[i1]  reflect.SelectCase{Dir:  reflect.SelectSend, // Chan - Send 发到多个目标通道Chan: reflect.ValueOf(out[i]),}}for {chosen, recv, _ : reflect.Select(cases)if chosen  0 {// Data received from the input channel 从输入通道接收的数据v : recv.Interface()for i : 1; i  len(cases); i {// Send the data to all output channels 将数据发送到所有输出通道cases[i].Send  reflect.ValueOf(v)}} else {// Data sent to an output channel 发送到输出通道的数据// 把接收通道的数据置空cases[chosen].Send  reflect.Value{}}}
}