[{"data":1,"prerenderedAt":2528},["ShallowReactive",2],{"content:\u002F2025\u002F08\u002Fgo-channel5":3,"surround:\u002F2025\u002F08\u002Fgo-channel5":2518},{"id":4,"title":5,"body":6,"categories":2495,"date":2497,"description":2498,"draft":2499,"extension":2500,"image":2501,"meta":2502,"navigation":486,"path":2504,"permalink":2501,"published":2501,"readingTime":2505,"recommend":2501,"references":2501,"seo":2510,"sitemap":2511,"stem":2512,"tags":2513,"type":2515,"updated":2516,"__hash__":2517},"content\u002Fposts\u002F2025\u002F08\u002Fgo-channel5.md","使用 Go Channel 实现简易 EventBus",{"type":7,"value":8,"toc":2485},"minimark",[9,13,26,30,120,123,129,181,184,187,288,291,294,298,558,569,572,852,863,866,1072,1082,1085,2478,2481],[10,11,12],"h2",{"id":12},"题目",[14,15,16,20,23],"ol",{},[17,18,19],"li",{},"适用于单机模块，主要用于异步事件分发",[17,21,22],{},"选用合适的数据结构，并编写合适的逻辑保证原子性",[17,24,25],{},"涵盖发布，订阅，取消订阅等功能",[27,28,29],"p",{},"首先，选取合适的数据结构是最重要的，选取 map 来存储事件总线，因为一个事件对应多个 channels 选取这种映射结构性能比较好",[31,32,37],"pre",{"className":33,"code":34,"language":35,"meta":36,"style":36},"language-go shiki shiki-themes github-light github-dark","type Eventbus struct {\n\tec map[string]*EventChans \u002F\u002F 设置为指针的目的是能够在订阅和取消订阅的时候原地修改\n\tmu sync.RWMutex\n}\n","go","",[38,39,40,64,97,114],"code",{"__ignoreMap":36},[41,42,45,49,53,56,60],"span",{"class":43,"data-line":44,"line":44},"line",1,[41,46,48],{"class":47},"szBVR","type",[41,50,52],{"class":51},"sScJk"," Eventbus",[41,54,55],{"class":47}," struct",[41,57,59],{"class":58},"sVt8B"," ",[41,61,63],{"class":62},"sSDpw","{\n",[41,65,67,71,74,77,81,84,87,90,93],{"class":43,"data-line":66,"line":66},2,[41,68,70],{"class":69},"indent","\t",[41,72,73],{"class":58},"ec ",[41,75,76],{"class":47},"map",[41,78,80],{"class":79},"sJX2D","[",[41,82,83],{"class":47},"string",[41,85,86],{"class":79},"]",[41,88,89],{"class":47},"*",[41,91,92],{"class":51},"EventChans",[41,94,96],{"class":95},"sJ8bj"," \u002F\u002F 设置为指针的目的是能够在订阅和取消订阅的时候原地修改\n",[41,98,100,102,105,108,111],{"class":43,"data-line":99,"line":99},3,[41,101,70],{"class":69},[41,103,104],{"class":58},"mu ",[41,106,107],{"class":51},"sync",[41,109,110],{"class":58},".",[41,112,113],{"class":51},"RWMutex\n",[41,115,117],{"class":43,"data-line":116,"line":116},4,[41,118,119],{"class":62},"}\n",[27,121,122],{},"然后在并发编程中，map 是读写不安全的，所以设置一把读写锁保证原子性",[27,124,125,126,128],{},"具体的",[38,127,92],{"code":92},"其实是一个存放 channel 的切片",[31,130,132],{"className":33,"code":131,"language":35,"meta":36,"style":36},"type EventChans struct {\n\tquery []chan int\n\tmu    sync.RWMutex\n}\n",[38,133,134,147,164,177],{"__ignoreMap":36},[41,135,136,138,141,143,145],{"class":43,"data-line":44,"line":44},[41,137,48],{"class":47},[41,139,140],{"class":51}," EventChans",[41,142,55],{"class":47},[41,144,59],{"class":58},[41,146,63],{"class":62},[41,148,149,151,154,156,158,161],{"class":43,"data-line":66,"line":66},[41,150,70],{"class":69},[41,152,153],{"class":58},"query ",[41,155,80],{"class":79},[41,157,86],{"class":79},[41,159,160],{"class":47},"chan",[41,162,163],{"class":47}," int\n",[41,165,166,168,171,173,175],{"class":43,"data-line":99,"line":99},[41,167,70],{"class":69},[41,169,170],{"class":58},"mu    ",[41,172,107],{"class":51},[41,174,110],{"class":58},[41,176,113],{"class":51},[41,178,179],{"class":43,"data-line":116,"line":116},[41,180,119],{"class":62},[27,182,183],{},"同样，在并发编程中，切片也是读写不安全的，所以设置一把读写锁保证原子性",[10,185,186],{"id":186},"定义接口",[31,188,190],{"className":33,"code":189,"language":35,"meta":36,"style":36},"type IEventbus interface {\n\tSubscribe(event string, ch chan int)\n\tUnSubscribe(event string, ch chan int)\n\tPublish(event string, message int)\n}\n",[38,191,192,206,238,261,283],{"__ignoreMap":36},[41,193,194,196,199,202,204],{"class":43,"data-line":44,"line":44},[41,195,48],{"class":47},[41,197,198],{"class":51}," IEventbus",[41,200,201],{"class":47}," interface",[41,203,59],{"class":58},[41,205,63],{"class":62},[41,207,208,210,213,216,220,223,226,229,232,235],{"class":43,"data-line":66,"line":66},[41,209,70],{"class":69},[41,211,212],{"class":51},"Subscribe",[41,214,215],{"class":79},"(",[41,217,219],{"class":218},"s4XuR","event",[41,221,222],{"class":47}," string",[41,224,225],{"class":58},", ",[41,227,228],{"class":218},"ch",[41,230,231],{"class":47}," chan",[41,233,234],{"class":47}," int",[41,236,237],{"class":79},")\n",[41,239,240,242,245,247,249,251,253,255,257,259],{"class":43,"data-line":99,"line":99},[41,241,70],{"class":69},[41,243,244],{"class":51},"UnSubscribe",[41,246,215],{"class":79},[41,248,219],{"class":218},[41,250,222],{"class":47},[41,252,225],{"class":58},[41,254,228],{"class":218},[41,256,231],{"class":47},[41,258,234],{"class":47},[41,260,237],{"class":79},[41,262,263,265,268,270,272,274,276,279,281],{"class":43,"data-line":116,"line":116},[41,264,70],{"class":69},[41,266,267],{"class":51},"Publish",[41,269,215],{"class":79},[41,271,219],{"class":218},[41,273,222],{"class":47},[41,275,225],{"class":58},[41,277,278],{"class":218},"message",[41,280,234],{"class":47},[41,282,237],{"class":79},[41,284,286],{"class":43,"data-line":285,"line":285},5,[41,287,119],{"class":62},[27,289,290],{},"分别对应订阅、取消订阅和发布这三个方法",[10,292,293],{"id":293},"具体实现",[295,296,297],"h3",{"id":297},"订阅",[31,299,301],{"className":33,"code":300,"language":35,"meta":36,"style":36},"func (eb *Eventbus) Subscribe(event string, ch chan int) chan int {\n\t\u002F\u002F 对map加互斥锁\n\teb.mu.Lock()\n\tec, ok := eb.ec[event]\n\tif !ok {\n\t\tec = &EventChans{}\n\t\teb.ec[event] = ec \u002F\u002F 初始化\n\t}\n\teb.mu.Unlock()\n\n\tec.mu.Lock()\n\tdefer ec.mu.Unlock()\n\tec.query = append(ec.query, ch)\n\treturn ch \u002F\u002F 返回用于监听广播的值\n}\n",[38,302,303,353,360,374,394,409,432,458,467,481,488,502,519,539,553],{"__ignoreMap":36},[41,304,305,308,310,312,315,317,320,323,325,327,329,331,333,335,337,339,341,343,345,347,349,351],{"class":43,"data-line":44,"line":44},[41,306,307],{"class":47},"func",[41,309,59],{"class":58},[41,311,215],{"class":62},[41,313,314],{"class":218},"eb ",[41,316,89],{"class":47},[41,318,319],{"class":51},"Eventbus",[41,321,322],{"class":62},")",[41,324,59],{"class":58},[41,326,212],{"class":51},[41,328,215],{"class":62},[41,330,219],{"class":218},[41,332,222],{"class":47},[41,334,225],{"class":58},[41,336,228],{"class":218},[41,338,231],{"class":47},[41,340,234],{"class":47},[41,342,322],{"class":62},[41,344,59],{"class":58},[41,346,160],{"class":47},[41,348,234],{"class":47},[41,350,59],{"class":58},[41,352,63],{"class":62},[41,354,355,357],{"class":43,"data-line":66,"line":66},[41,356,70],{"class":69},[41,358,359],{"class":95},"\u002F\u002F 对map加互斥锁\n",[41,361,362,364,367,370,372],{"class":43,"data-line":99,"line":99},[41,363,70],{"class":69},[41,365,366],{"class":58},"eb.mu.",[41,368,369],{"class":51},"Lock",[41,371,215],{"class":79},[41,373,237],{"class":79},[41,375,376,378,381,384,387,389,391],{"class":43,"data-line":116,"line":116},[41,377,70],{"class":69},[41,379,380],{"class":58},"ec, ok ",[41,382,383],{"class":47},":=",[41,385,386],{"class":58}," eb.ec",[41,388,80],{"class":79},[41,390,219],{"class":58},[41,392,393],{"class":79},"]\n",[41,395,396,398,401,404,407],{"class":43,"data-line":285,"line":285},[41,397,70],{"class":69},[41,399,400],{"class":47},"if",[41,402,403],{"class":47}," !",[41,405,406],{"class":58},"ok ",[41,408,63],{"class":79},[41,410,412,414,416,418,421,424,426,430],{"class":43,"data-line":411,"line":411},6,[41,413,70],{"class":69},[41,415,70],{"class":69},[41,417,73],{"class":58},[41,419,420],{"class":47},"=",[41,422,423],{"class":47}," &",[41,425,92],{"class":51},[41,427,429],{"class":428},"sqkie","{",[41,431,119],{"class":428},[41,433,435,437,439,442,444,446,448,450,452,455],{"class":43,"data-line":434,"line":434},7,[41,436,70],{"class":69},[41,438,70],{"class":69},[41,440,441],{"class":58},"eb.ec",[41,443,80],{"class":428},[41,445,219],{"class":58},[41,447,86],{"class":428},[41,449,59],{"class":58},[41,451,420],{"class":47},[41,453,454],{"class":58}," ec ",[41,456,457],{"class":95},"\u002F\u002F 初始化\n",[41,459,461,463,465],{"class":43,"data-line":460,"line":460},8,[41,462,70],{"class":69},[41,464,36],{"class":58},[41,466,119],{"class":79},[41,468,470,472,474,477,479],{"class":43,"data-line":469,"line":469},9,[41,471,70],{"class":69},[41,473,366],{"class":58},[41,475,476],{"class":51},"Unlock",[41,478,215],{"class":79},[41,480,237],{"class":79},[41,482,484],{"class":43,"data-line":483,"line":483},10,[41,485,487],{"emptyLinePlaceholder":486},true,"\n",[41,489,491,493,496,498,500],{"class":43,"data-line":490,"line":490},11,[41,492,70],{"class":69},[41,494,495],{"class":58},"ec.mu.",[41,497,369],{"class":51},[41,499,215],{"class":79},[41,501,237],{"class":79},[41,503,505,507,510,513,515,517],{"class":43,"data-line":504,"line":504},12,[41,506,70],{"class":69},[41,508,509],{"class":47},"defer",[41,511,512],{"class":58}," ec.mu.",[41,514,476],{"class":51},[41,516,215],{"class":79},[41,518,237],{"class":79},[41,520,522,524,527,529,532,534,537],{"class":43,"data-line":521,"line":521},13,[41,523,70],{"class":69},[41,525,526],{"class":58},"ec.query ",[41,528,420],{"class":47},[41,530,531],{"class":51}," append",[41,533,215],{"class":79},[41,535,536],{"class":58},"ec.query, ch",[41,538,237],{"class":79},[41,540,542,544,547,550],{"class":43,"data-line":541,"line":541},14,[41,543,70],{"class":69},[41,545,546],{"class":47},"return",[41,548,549],{"class":58}," ch ",[41,551,552],{"class":95},"\u002F\u002F 返回用于监听广播的值\n",[41,554,556],{"class":43,"data-line":555,"line":555},15,[41,557,119],{"class":62},[14,559,560,563,566],{},[17,561,562],{},"在订阅过程中，伴随着事件的增加，所以在访问 map 需要加一把互斥锁，在访问完再放开",[17,564,565],{},"在订阅过程中，需要新增 channel，需要加把互斥锁，在访问完放开",[17,567,568],{},"考虑没有对应事件的时候新增事件",[295,570,571],{"id":571},"取消订阅",[31,573,575],{"className":33,"code":574,"language":35,"meta":36,"style":36},"func (eb *Eventbus) UnSubscribe(event string, ch chan int) {\n\t\u002F\u002F 对map加互斥锁\n\teb.mu.Lock()\n\tec, ok := eb.ec[event]\n\teb.mu.Unlock()\n\tif !ok {\n\t\treturn \u002F\u002F 没找到直接返回\n\t}\n\n\tec.mu.Lock()\n\tdefer ec.mu.Unlock()\n\tfor i, ech := range ec.query {\n\t\tif ch == ech {\n\t\t\tec.query = append(ec.query[0:i], ec.query[i+1:]...)\n\t\t\tbreak\n\t\t}\n\t}\n}\n",[38,576,577,617,623,635,651,663,675,686,694,698,710,724,744,762,816,827,838,847],{"__ignoreMap":36},[41,578,579,581,583,585,587,589,591,593,595,597,599,601,603,605,607,609,611,613,615],{"class":43,"data-line":44,"line":44},[41,580,307],{"class":47},[41,582,59],{"class":58},[41,584,215],{"class":62},[41,586,314],{"class":218},[41,588,89],{"class":47},[41,590,319],{"class":51},[41,592,322],{"class":62},[41,594,59],{"class":58},[41,596,244],{"class":51},[41,598,215],{"class":62},[41,600,219],{"class":218},[41,602,222],{"class":47},[41,604,225],{"class":58},[41,606,228],{"class":218},[41,608,231],{"class":47},[41,610,234],{"class":47},[41,612,322],{"class":62},[41,614,59],{"class":58},[41,616,63],{"class":62},[41,618,619,621],{"class":43,"data-line":66,"line":66},[41,620,70],{"class":69},[41,622,359],{"class":95},[41,624,625,627,629,631,633],{"class":43,"data-line":99,"line":99},[41,626,70],{"class":69},[41,628,366],{"class":58},[41,630,369],{"class":51},[41,632,215],{"class":79},[41,634,237],{"class":79},[41,636,637,639,641,643,645,647,649],{"class":43,"data-line":116,"line":116},[41,638,70],{"class":69},[41,640,380],{"class":58},[41,642,383],{"class":47},[41,644,386],{"class":58},[41,646,80],{"class":79},[41,648,219],{"class":58},[41,650,393],{"class":79},[41,652,653,655,657,659,661],{"class":43,"data-line":285,"line":285},[41,654,70],{"class":69},[41,656,366],{"class":58},[41,658,476],{"class":51},[41,660,215],{"class":79},[41,662,237],{"class":79},[41,664,665,667,669,671,673],{"class":43,"data-line":411,"line":411},[41,666,70],{"class":69},[41,668,400],{"class":47},[41,670,403],{"class":47},[41,672,406],{"class":58},[41,674,63],{"class":79},[41,676,677,679,681,683],{"class":43,"data-line":434,"line":434},[41,678,70],{"class":69},[41,680,70],{"class":69},[41,682,546],{"class":47},[41,684,685],{"class":95}," \u002F\u002F 没找到直接返回\n",[41,687,688,690,692],{"class":43,"data-line":460,"line":460},[41,689,70],{"class":69},[41,691,36],{"class":58},[41,693,119],{"class":79},[41,695,696],{"class":43,"data-line":469,"line":469},[41,697,487],{"emptyLinePlaceholder":486},[41,699,700,702,704,706,708],{"class":43,"data-line":483,"line":483},[41,701,70],{"class":69},[41,703,495],{"class":58},[41,705,369],{"class":51},[41,707,215],{"class":79},[41,709,237],{"class":79},[41,711,712,714,716,718,720,722],{"class":43,"data-line":490,"line":490},[41,713,70],{"class":69},[41,715,509],{"class":47},[41,717,512],{"class":58},[41,719,476],{"class":51},[41,721,215],{"class":79},[41,723,237],{"class":79},[41,725,726,728,731,734,736,739,742],{"class":43,"data-line":504,"line":504},[41,727,70],{"class":69},[41,729,730],{"class":47},"for",[41,732,733],{"class":58}," i, ech ",[41,735,383],{"class":47},[41,737,738],{"class":47}," range",[41,740,741],{"class":58}," ec.query ",[41,743,63],{"class":79},[41,745,746,748,750,752,754,757,760],{"class":43,"data-line":521,"line":521},[41,747,70],{"class":69},[41,749,70],{"class":69},[41,751,400],{"class":47},[41,753,549],{"class":58},[41,755,756],{"class":47},"==",[41,758,759],{"class":58}," ech ",[41,761,63],{"class":428},[41,763,764,766,768,770,772,774,776,778,781,783,787,790,792,795,797,800,803,806,809,811,814],{"class":43,"data-line":541,"line":541},[41,765,70],{"class":69},[41,767,70],{"class":69},[41,769,70],{"class":69},[41,771,526],{"class":58},[41,773,420],{"class":47},[41,775,531],{"class":51},[41,777,215],{"class":62},[41,779,780],{"class":58},"ec.query",[41,782,80],{"class":79},[41,784,786],{"class":785},"sj4cs","0",[41,788,789],{"class":58},":i",[41,791,86],{"class":79},[41,793,794],{"class":58},", ec.query",[41,796,80],{"class":79},[41,798,799],{"class":58},"i",[41,801,802],{"class":47},"+",[41,804,805],{"class":785},"1",[41,807,808],{"class":58},":",[41,810,86],{"class":79},[41,812,813],{"class":47},"...",[41,815,237],{"class":62},[41,817,818,820,822,824],{"class":43,"data-line":555,"line":555},[41,819,70],{"class":69},[41,821,70],{"class":69},[41,823,70],{"class":69},[41,825,826],{"class":47},"break\n",[41,828,830,832,834,836],{"class":43,"data-line":829,"line":829},16,[41,831,70],{"class":69},[41,833,70],{"class":69},[41,835,36],{"class":58},[41,837,119],{"class":428},[41,839,841,843,845],{"class":43,"data-line":840,"line":840},17,[41,842,70],{"class":69},[41,844,36],{"class":58},[41,846,119],{"class":79},[41,848,850],{"class":43,"data-line":849,"line":849},18,[41,851,119],{"class":62},[14,853,854,857,860],{},[17,855,856],{},"在取消订阅过程中，其他事件可能修改 map，所以在访问 map 需要加一把互斥锁，在访问完再放开",[17,858,859],{},"在订阅过程中，需要减少 channel，需要加把互斥锁，在访问完放开",[17,861,862],{},"考虑没有事件的时候直接返回",[295,864,865],{"id":865},"发布",[31,867,869],{"className":33,"code":868,"language":35,"meta":36,"style":36},"func (eb *Eventbus) Publish(event string, message int) {\n\t\u002F\u002F 对map加读锁\n\teb.mu.RLock()\n\tec, ok := eb.ec[event]\n\teb.mu.RUnlock()\n\tif !ok {\n\t\treturn \u002F\u002F 没找到直接返回\n\t}\n\n\t\u002F\u002F 对切片加读锁\n\tec.mu.RLock()\n\tdefer ec.mu.RUnlock()\n\tfor _, ch := range ec.query {\n\t\tch \u003C- message\n\t}\n}\n",[38,870,871,909,916,929,945,958,970,980,988,992,999,1011,1025,1042,1060,1068],{"__ignoreMap":36},[41,872,873,875,877,879,881,883,885,887,889,891,893,895,897,899,901,903,905,907],{"class":43,"data-line":44,"line":44},[41,874,307],{"class":47},[41,876,59],{"class":58},[41,878,215],{"class":62},[41,880,314],{"class":218},[41,882,89],{"class":47},[41,884,319],{"class":51},[41,886,322],{"class":62},[41,888,59],{"class":58},[41,890,267],{"class":51},[41,892,215],{"class":62},[41,894,219],{"class":218},[41,896,222],{"class":47},[41,898,225],{"class":58},[41,900,278],{"class":218},[41,902,234],{"class":47},[41,904,322],{"class":62},[41,906,59],{"class":58},[41,908,63],{"class":62},[41,910,911,913],{"class":43,"data-line":66,"line":66},[41,912,70],{"class":69},[41,914,915],{"class":95},"\u002F\u002F 对map加读锁\n",[41,917,918,920,922,925,927],{"class":43,"data-line":99,"line":99},[41,919,70],{"class":69},[41,921,366],{"class":58},[41,923,924],{"class":51},"RLock",[41,926,215],{"class":79},[41,928,237],{"class":79},[41,930,931,933,935,937,939,941,943],{"class":43,"data-line":116,"line":116},[41,932,70],{"class":69},[41,934,380],{"class":58},[41,936,383],{"class":47},[41,938,386],{"class":58},[41,940,80],{"class":79},[41,942,219],{"class":58},[41,944,393],{"class":79},[41,946,947,949,951,954,956],{"class":43,"data-line":285,"line":285},[41,948,70],{"class":69},[41,950,366],{"class":58},[41,952,953],{"class":51},"RUnlock",[41,955,215],{"class":79},[41,957,237],{"class":79},[41,959,960,962,964,966,968],{"class":43,"data-line":411,"line":411},[41,961,70],{"class":69},[41,963,400],{"class":47},[41,965,403],{"class":47},[41,967,406],{"class":58},[41,969,63],{"class":79},[41,971,972,974,976,978],{"class":43,"data-line":434,"line":434},[41,973,70],{"class":69},[41,975,70],{"class":69},[41,977,546],{"class":47},[41,979,685],{"class":95},[41,981,982,984,986],{"class":43,"data-line":460,"line":460},[41,983,70],{"class":69},[41,985,36],{"class":58},[41,987,119],{"class":79},[41,989,990],{"class":43,"data-line":469,"line":469},[41,991,487],{"emptyLinePlaceholder":486},[41,993,994,996],{"class":43,"data-line":483,"line":483},[41,995,70],{"class":69},[41,997,998],{"class":95},"\u002F\u002F 对切片加读锁\n",[41,1000,1001,1003,1005,1007,1009],{"class":43,"data-line":490,"line":490},[41,1002,70],{"class":69},[41,1004,495],{"class":58},[41,1006,924],{"class":51},[41,1008,215],{"class":79},[41,1010,237],{"class":79},[41,1012,1013,1015,1017,1019,1021,1023],{"class":43,"data-line":504,"line":504},[41,1014,70],{"class":69},[41,1016,509],{"class":47},[41,1018,512],{"class":58},[41,1020,953],{"class":51},[41,1022,215],{"class":79},[41,1024,237],{"class":79},[41,1026,1027,1029,1031,1034,1036,1038,1040],{"class":43,"data-line":521,"line":521},[41,1028,70],{"class":69},[41,1030,730],{"class":47},[41,1032,1033],{"class":58}," _, ch ",[41,1035,383],{"class":47},[41,1037,738],{"class":47},[41,1039,741],{"class":58},[41,1041,63],{"class":79},[41,1043,1044,1046,1048,1051,1054,1057],{"class":43,"data-line":541,"line":541},[41,1045,70],{"class":69},[41,1047,70],{"class":69},[41,1049,1050],{"class":58},"ch ",[41,1052,1053],{"class":47},"\u003C",[41,1055,1056],{"class":47},"-",[41,1058,1059],{"class":58}," message\n",[41,1061,1062,1064,1066],{"class":43,"data-line":555,"line":555},[41,1063,70],{"class":69},[41,1065,36],{"class":58},[41,1067,119],{"class":79},[41,1069,1070],{"class":43,"data-line":829,"line":829},[41,1071,119],{"class":62},[14,1073,1074,1077,1080],{},[17,1075,1076],{},"在发布过程中，map 允许被多个 goroutine 读取但是不允许被写入，所以在访问 map 加一把读锁，在访问完再放开",[17,1078,1079],{},"在发布过程中，不允许 channel 的增减，需要加把互斥锁，在访问完放开",[17,1081,862],{},[10,1083,1084],{"id":1084},"完整代码以及具体实现",[31,1086,1088],{"className":33,"code":1087,"language":35,"meta":36,"style":36},"package main\n\nimport (\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n)\n\ntype EventChans struct {\n\tquery []chan int\n\tmu    sync.RWMutex\n}\n\ntype Eventbus struct {\n\tec map[string]*EventChans \u002F\u002F 设置为指针的目的是能够在订阅和取消订阅的时候原地修改\n\tmu sync.RWMutex\n}\n\nfunc NewEventbus() *Eventbus {\n\treturn &Eventbus{\n\t\tmu: sync.RWMutex{},\n\t\tec: make(map[string]*EventChans, 10),\n\t}\n}\n\ntype IEventbus interface {\n\tSubscribe(event string, ch chan int)\n\tUnSubscribe(event string, ch chan int)\n\tPublish(event string, message int)\n}\n\nfunc (eb *Eventbus) Subscribe(event string, ch chan int) chan int {\n\t\u002F\u002F 对map加互斥锁\n\teb.mu.Lock()\n\tec, ok := eb.ec[event]\n\tif !ok {\n\t\tec = &EventChans{}\n\t\teb.ec[event] = ec \u002F\u002F 初始化\n\t}\n\teb.mu.Unlock()\n\n\tec.mu.Lock()\n\tdefer ec.mu.Unlock()\n\tec.query = append(ec.query, ch)\n\treturn ch \u002F\u002F 返回用于监听广播的值\n}\n\nfunc (eb *Eventbus) UnSubscribe(event string, ch chan int) {\n\t\u002F\u002F 对map加互斥锁\n\teb.mu.Lock()\n\tec, ok := eb.ec[event]\n\teb.mu.Unlock()\n\tif !ok {\n\t\treturn \u002F\u002F 没找到直接返回\n\t}\n\n\tec.mu.Lock()\n\tdefer ec.mu.Unlock()\n\tfor i, ech := range ec.query {\n\t\tif ch == ech {\n\t\t\tec.query = append(ec.query[0:i], ec.query[i+1:]...)\n\t\t\tbreak\n\t\t}\n\t}\n}\n\nfunc (eb *Eventbus) Publish(event string, message int) {\n\t\u002F\u002F 对map加读锁\n\teb.mu.RLock()\n\tec, ok := eb.ec[event]\n\teb.mu.RUnlock()\n\tif !ok {\n\t\treturn \u002F\u002F 没找到直接返回\n\t}\n\n\t\u002F\u002F 对切片加读锁\n\tec.mu.RLock()\n\tdefer ec.mu.RUnlock()\n\tfor _, ch := range ec.query {\n\t\tch \u003C- message\n\t}\n}\n\nfunc subscribe(eb *Eventbus) {\n\tch := make(chan int, 1)\n\teb.Subscribe(\"event1\", ch)\n\twg.Done()\n\tfmt.Println(\"订阅完毕，开始等待接收\")\n\tfmt.Println(\"接收到值:\", \u003C-ch)\n}\n\nvar wg sync.WaitGroup\n\nfunc main() {\n\teb := NewEventbus()\n\tgo subscribe(eb)\n\n\t\u002F\u002F 发布事件\n\n\twg.Add(1)\n\twg.Wait() \u002F\u002F 等待订阅成功\n\teb.Publish(\"event1\", 666)\n\ttime.Sleep(time.Second)\n}\n",[38,1089,1090,1098,1102,1112,1126,1136,1147,1151,1155,1167,1181,1193,1197,1201,1213,1233,1245,1249,1253,1275,1288,1313,1349,1358,1363,1368,1381,1404,1427,1448,1453,1458,1505,1512,1525,1542,1555,1574,1597,1606,1619,1624,1637,1652,1669,1680,1685,1690,1731,1738,1751,1768,1781,1794,1805,1814,1819,1832,1847,1864,1881,1926,1937,1948,1957,1962,1967,2006,2013,2026,2043,2056,2069,2080,2089,2094,2101,2114,2129,2146,2161,2170,2175,2180,2204,2228,2248,2263,2281,2305,2310,2315,2331,2336,2352,2367,2382,2387,2395,2400,2416,2435,2455,2473],{"__ignoreMap":36},[41,1091,1092,1095],{"class":43,"data-line":44,"line":44},[41,1093,1094],{"class":47},"package",[41,1096,1097],{"class":51}," main\n",[41,1099,1100],{"class":43,"data-line":66,"line":66},[41,1101,487],{"emptyLinePlaceholder":486},[41,1103,1104,1107,1109],{"class":43,"data-line":99,"line":99},[41,1105,1106],{"class":47},"import",[41,1108,59],{"class":58},[41,1110,1111],{"class":62},"(\n",[41,1113,1114,1116,1120,1123],{"class":43,"data-line":116,"line":116},[41,1115,70],{"class":69},[41,1117,1119],{"class":1118},"sZZnC","\"",[41,1121,1122],{"class":51},"fmt",[41,1124,1125],{"class":1118},"\"\n",[41,1127,1128,1130,1132,1134],{"class":43,"data-line":285,"line":285},[41,1129,70],{"class":69},[41,1131,1119],{"class":1118},[41,1133,107],{"class":51},[41,1135,1125],{"class":1118},[41,1137,1138,1140,1142,1145],{"class":43,"data-line":411,"line":411},[41,1139,70],{"class":69},[41,1141,1119],{"class":1118},[41,1143,1144],{"class":51},"time",[41,1146,1125],{"class":1118},[41,1148,1149],{"class":43,"data-line":434,"line":434},[41,1150,237],{"class":62},[41,1152,1153],{"class":43,"data-line":460,"line":460},[41,1154,487],{"emptyLinePlaceholder":486},[41,1156,1157,1159,1161,1163,1165],{"class":43,"data-line":469,"line":469},[41,1158,48],{"class":47},[41,1160,140],{"class":51},[41,1162,55],{"class":47},[41,1164,59],{"class":58},[41,1166,63],{"class":62},[41,1168,1169,1171,1173,1175,1177,1179],{"class":43,"data-line":483,"line":483},[41,1170,70],{"class":69},[41,1172,153],{"class":58},[41,1174,80],{"class":79},[41,1176,86],{"class":79},[41,1178,160],{"class":47},[41,1180,163],{"class":47},[41,1182,1183,1185,1187,1189,1191],{"class":43,"data-line":490,"line":490},[41,1184,70],{"class":69},[41,1186,170],{"class":58},[41,1188,107],{"class":51},[41,1190,110],{"class":58},[41,1192,113],{"class":51},[41,1194,1195],{"class":43,"data-line":504,"line":504},[41,1196,119],{"class":62},[41,1198,1199],{"class":43,"data-line":521,"line":521},[41,1200,487],{"emptyLinePlaceholder":486},[41,1202,1203,1205,1207,1209,1211],{"class":43,"data-line":541,"line":541},[41,1204,48],{"class":47},[41,1206,52],{"class":51},[41,1208,55],{"class":47},[41,1210,59],{"class":58},[41,1212,63],{"class":62},[41,1214,1215,1217,1219,1221,1223,1225,1227,1229,1231],{"class":43,"data-line":555,"line":555},[41,1216,70],{"class":69},[41,1218,73],{"class":58},[41,1220,76],{"class":47},[41,1222,80],{"class":79},[41,1224,83],{"class":47},[41,1226,86],{"class":79},[41,1228,89],{"class":47},[41,1230,92],{"class":51},[41,1232,96],{"class":95},[41,1234,1235,1237,1239,1241,1243],{"class":43,"data-line":829,"line":829},[41,1236,70],{"class":69},[41,1238,104],{"class":58},[41,1240,107],{"class":51},[41,1242,110],{"class":58},[41,1244,113],{"class":51},[41,1246,1247],{"class":43,"data-line":840,"line":840},[41,1248,119],{"class":62},[41,1250,1251],{"class":43,"data-line":849,"line":849},[41,1252,487],{"emptyLinePlaceholder":486},[41,1254,1256,1258,1261,1263,1265,1267,1269,1271,1273],{"class":43,"data-line":1255,"line":1255},19,[41,1257,307],{"class":47},[41,1259,1260],{"class":51}," NewEventbus",[41,1262,215],{"class":62},[41,1264,322],{"class":62},[41,1266,59],{"class":58},[41,1268,89],{"class":47},[41,1270,319],{"class":51},[41,1272,59],{"class":58},[41,1274,63],{"class":62},[41,1276,1278,1280,1282,1284,1286],{"class":43,"data-line":1277,"line":1277},20,[41,1279,70],{"class":69},[41,1281,546],{"class":47},[41,1283,423],{"class":47},[41,1285,319],{"class":51},[41,1287,63],{"class":79},[41,1289,1291,1293,1295,1298,1300,1302,1305,1307,1310],{"class":43,"data-line":1290,"line":1290},21,[41,1292,70],{"class":69},[41,1294,70],{"class":69},[41,1296,1297],{"class":58},"mu: ",[41,1299,107],{"class":51},[41,1301,110],{"class":58},[41,1303,1304],{"class":51},"RWMutex",[41,1306,429],{"class":428},[41,1308,1309],{"class":428},"}",[41,1311,1312],{"class":58},",\n",[41,1314,1316,1318,1320,1323,1326,1328,1330,1332,1334,1336,1338,1340,1342,1345,1347],{"class":43,"data-line":1315,"line":1315},22,[41,1317,70],{"class":69},[41,1319,70],{"class":69},[41,1321,1322],{"class":58},"ec: ",[41,1324,1325],{"class":51},"make",[41,1327,215],{"class":428},[41,1329,76],{"class":47},[41,1331,80],{"class":62},[41,1333,83],{"class":47},[41,1335,86],{"class":62},[41,1337,89],{"class":47},[41,1339,92],{"class":51},[41,1341,225],{"class":58},[41,1343,1344],{"class":785},"10",[41,1346,322],{"class":428},[41,1348,1312],{"class":58},[41,1350,1352,1354,1356],{"class":43,"data-line":1351,"line":1351},23,[41,1353,70],{"class":69},[41,1355,36],{"class":58},[41,1357,119],{"class":79},[41,1359,1361],{"class":43,"data-line":1360,"line":1360},24,[41,1362,119],{"class":62},[41,1364,1366],{"class":43,"data-line":1365,"line":1365},25,[41,1367,487],{"emptyLinePlaceholder":486},[41,1369,1371,1373,1375,1377,1379],{"class":43,"data-line":1370,"line":1370},26,[41,1372,48],{"class":47},[41,1374,198],{"class":51},[41,1376,201],{"class":47},[41,1378,59],{"class":58},[41,1380,63],{"class":62},[41,1382,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402],{"class":43,"data-line":1383,"line":1383},27,[41,1385,70],{"class":69},[41,1387,212],{"class":51},[41,1389,215],{"class":79},[41,1391,219],{"class":218},[41,1393,222],{"class":47},[41,1395,225],{"class":58},[41,1397,228],{"class":218},[41,1399,231],{"class":47},[41,1401,234],{"class":47},[41,1403,237],{"class":79},[41,1405,1407,1409,1411,1413,1415,1417,1419,1421,1423,1425],{"class":43,"data-line":1406,"line":1406},28,[41,1408,70],{"class":69},[41,1410,244],{"class":51},[41,1412,215],{"class":79},[41,1414,219],{"class":218},[41,1416,222],{"class":47},[41,1418,225],{"class":58},[41,1420,228],{"class":218},[41,1422,231],{"class":47},[41,1424,234],{"class":47},[41,1426,237],{"class":79},[41,1428,1430,1432,1434,1436,1438,1440,1442,1444,1446],{"class":43,"data-line":1429,"line":1429},29,[41,1431,70],{"class":69},[41,1433,267],{"class":51},[41,1435,215],{"class":79},[41,1437,219],{"class":218},[41,1439,222],{"class":47},[41,1441,225],{"class":58},[41,1443,278],{"class":218},[41,1445,234],{"class":47},[41,1447,237],{"class":79},[41,1449,1451],{"class":43,"data-line":1450,"line":1450},30,[41,1452,119],{"class":62},[41,1454,1456],{"class":43,"data-line":1455,"line":1455},31,[41,1457,487],{"emptyLinePlaceholder":486},[41,1459,1461,1463,1465,1467,1469,1471,1473,1475,1477,1479,1481,1483,1485,1487,1489,1491,1493,1495,1497,1499,1501,1503],{"class":43,"data-line":1460,"line":1460},32,[41,1462,307],{"class":47},[41,1464,59],{"class":58},[41,1466,215],{"class":62},[41,1468,314],{"class":218},[41,1470,89],{"class":47},[41,1472,319],{"class":51},[41,1474,322],{"class":62},[41,1476,59],{"class":58},[41,1478,212],{"class":51},[41,1480,215],{"class":62},[41,1482,219],{"class":218},[41,1484,222],{"class":47},[41,1486,225],{"class":58},[41,1488,228],{"class":218},[41,1490,231],{"class":47},[41,1492,234],{"class":47},[41,1494,322],{"class":62},[41,1496,59],{"class":58},[41,1498,160],{"class":47},[41,1500,234],{"class":47},[41,1502,59],{"class":58},[41,1504,63],{"class":62},[41,1506,1508,1510],{"class":43,"data-line":1507,"line":1507},33,[41,1509,70],{"class":69},[41,1511,359],{"class":95},[41,1513,1515,1517,1519,1521,1523],{"class":43,"data-line":1514,"line":1514},34,[41,1516,70],{"class":69},[41,1518,366],{"class":58},[41,1520,369],{"class":51},[41,1522,215],{"class":79},[41,1524,237],{"class":79},[41,1526,1528,1530,1532,1534,1536,1538,1540],{"class":43,"data-line":1527,"line":1527},35,[41,1529,70],{"class":69},[41,1531,380],{"class":58},[41,1533,383],{"class":47},[41,1535,386],{"class":58},[41,1537,80],{"class":79},[41,1539,219],{"class":58},[41,1541,393],{"class":79},[41,1543,1545,1547,1549,1551,1553],{"class":43,"data-line":1544,"line":1544},36,[41,1546,70],{"class":69},[41,1548,400],{"class":47},[41,1550,403],{"class":47},[41,1552,406],{"class":58},[41,1554,63],{"class":79},[41,1556,1558,1560,1562,1564,1566,1568,1570,1572],{"class":43,"data-line":1557,"line":1557},37,[41,1559,70],{"class":69},[41,1561,70],{"class":69},[41,1563,73],{"class":58},[41,1565,420],{"class":47},[41,1567,423],{"class":47},[41,1569,92],{"class":51},[41,1571,429],{"class":428},[41,1573,119],{"class":428},[41,1575,1577,1579,1581,1583,1585,1587,1589,1591,1593,1595],{"class":43,"data-line":1576,"line":1576},38,[41,1578,70],{"class":69},[41,1580,70],{"class":69},[41,1582,441],{"class":58},[41,1584,80],{"class":428},[41,1586,219],{"class":58},[41,1588,86],{"class":428},[41,1590,59],{"class":58},[41,1592,420],{"class":47},[41,1594,454],{"class":58},[41,1596,457],{"class":95},[41,1598,1600,1602,1604],{"class":43,"data-line":1599,"line":1599},39,[41,1601,70],{"class":69},[41,1603,36],{"class":58},[41,1605,119],{"class":79},[41,1607,1609,1611,1613,1615,1617],{"class":43,"data-line":1608,"line":1608},40,[41,1610,70],{"class":69},[41,1612,366],{"class":58},[41,1614,476],{"class":51},[41,1616,215],{"class":79},[41,1618,237],{"class":79},[41,1620,1622],{"class":43,"data-line":1621,"line":1621},41,[41,1623,487],{"emptyLinePlaceholder":486},[41,1625,1627,1629,1631,1633,1635],{"class":43,"data-line":1626,"line":1626},42,[41,1628,70],{"class":69},[41,1630,495],{"class":58},[41,1632,369],{"class":51},[41,1634,215],{"class":79},[41,1636,237],{"class":79},[41,1638,1640,1642,1644,1646,1648,1650],{"class":43,"data-line":1639,"line":1639},43,[41,1641,70],{"class":69},[41,1643,509],{"class":47},[41,1645,512],{"class":58},[41,1647,476],{"class":51},[41,1649,215],{"class":79},[41,1651,237],{"class":79},[41,1653,1655,1657,1659,1661,1663,1665,1667],{"class":43,"data-line":1654,"line":1654},44,[41,1656,70],{"class":69},[41,1658,526],{"class":58},[41,1660,420],{"class":47},[41,1662,531],{"class":51},[41,1664,215],{"class":79},[41,1666,536],{"class":58},[41,1668,237],{"class":79},[41,1670,1672,1674,1676,1678],{"class":43,"data-line":1671,"line":1671},45,[41,1673,70],{"class":69},[41,1675,546],{"class":47},[41,1677,549],{"class":58},[41,1679,552],{"class":95},[41,1681,1683],{"class":43,"data-line":1682,"line":1682},46,[41,1684,119],{"class":62},[41,1686,1688],{"class":43,"data-line":1687,"line":1687},47,[41,1689,487],{"emptyLinePlaceholder":486},[41,1691,1693,1695,1697,1699,1701,1703,1705,1707,1709,1711,1713,1715,1717,1719,1721,1723,1725,1727,1729],{"class":43,"data-line":1692,"line":1692},48,[41,1694,307],{"class":47},[41,1696,59],{"class":58},[41,1698,215],{"class":62},[41,1700,314],{"class":218},[41,1702,89],{"class":47},[41,1704,319],{"class":51},[41,1706,322],{"class":62},[41,1708,59],{"class":58},[41,1710,244],{"class":51},[41,1712,215],{"class":62},[41,1714,219],{"class":218},[41,1716,222],{"class":47},[41,1718,225],{"class":58},[41,1720,228],{"class":218},[41,1722,231],{"class":47},[41,1724,234],{"class":47},[41,1726,322],{"class":62},[41,1728,59],{"class":58},[41,1730,63],{"class":62},[41,1732,1734,1736],{"class":43,"data-line":1733,"line":1733},49,[41,1735,70],{"class":69},[41,1737,359],{"class":95},[41,1739,1741,1743,1745,1747,1749],{"class":43,"data-line":1740,"line":1740},50,[41,1742,70],{"class":69},[41,1744,366],{"class":58},[41,1746,369],{"class":51},[41,1748,215],{"class":79},[41,1750,237],{"class":79},[41,1752,1754,1756,1758,1760,1762,1764,1766],{"class":43,"data-line":1753,"line":1753},51,[41,1755,70],{"class":69},[41,1757,380],{"class":58},[41,1759,383],{"class":47},[41,1761,386],{"class":58},[41,1763,80],{"class":79},[41,1765,219],{"class":58},[41,1767,393],{"class":79},[41,1769,1771,1773,1775,1777,1779],{"class":43,"data-line":1770,"line":1770},52,[41,1772,70],{"class":69},[41,1774,366],{"class":58},[41,1776,476],{"class":51},[41,1778,215],{"class":79},[41,1780,237],{"class":79},[41,1782,1784,1786,1788,1790,1792],{"class":43,"data-line":1783,"line":1783},53,[41,1785,70],{"class":69},[41,1787,400],{"class":47},[41,1789,403],{"class":47},[41,1791,406],{"class":58},[41,1793,63],{"class":79},[41,1795,1797,1799,1801,1803],{"class":43,"data-line":1796,"line":1796},54,[41,1798,70],{"class":69},[41,1800,70],{"class":69},[41,1802,546],{"class":47},[41,1804,685],{"class":95},[41,1806,1808,1810,1812],{"class":43,"data-line":1807,"line":1807},55,[41,1809,70],{"class":69},[41,1811,36],{"class":58},[41,1813,119],{"class":79},[41,1815,1817],{"class":43,"data-line":1816,"line":1816},56,[41,1818,487],{"emptyLinePlaceholder":486},[41,1820,1822,1824,1826,1828,1830],{"class":43,"data-line":1821,"line":1821},57,[41,1823,70],{"class":69},[41,1825,495],{"class":58},[41,1827,369],{"class":51},[41,1829,215],{"class":79},[41,1831,237],{"class":79},[41,1833,1835,1837,1839,1841,1843,1845],{"class":43,"data-line":1834,"line":1834},58,[41,1836,70],{"class":69},[41,1838,509],{"class":47},[41,1840,512],{"class":58},[41,1842,476],{"class":51},[41,1844,215],{"class":79},[41,1846,237],{"class":79},[41,1848,1850,1852,1854,1856,1858,1860,1862],{"class":43,"data-line":1849,"line":1849},59,[41,1851,70],{"class":69},[41,1853,730],{"class":47},[41,1855,733],{"class":58},[41,1857,383],{"class":47},[41,1859,738],{"class":47},[41,1861,741],{"class":58},[41,1863,63],{"class":79},[41,1865,1867,1869,1871,1873,1875,1877,1879],{"class":43,"data-line":1866,"line":1866},60,[41,1868,70],{"class":69},[41,1870,70],{"class":69},[41,1872,400],{"class":47},[41,1874,549],{"class":58},[41,1876,756],{"class":47},[41,1878,759],{"class":58},[41,1880,63],{"class":428},[41,1882,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904,1906,1908,1910,1912,1914,1916,1918,1920,1922,1924],{"class":43,"data-line":1883,"line":1883},61,[41,1885,70],{"class":69},[41,1887,70],{"class":69},[41,1889,70],{"class":69},[41,1891,526],{"class":58},[41,1893,420],{"class":47},[41,1895,531],{"class":51},[41,1897,215],{"class":62},[41,1899,780],{"class":58},[41,1901,80],{"class":79},[41,1903,786],{"class":785},[41,1905,789],{"class":58},[41,1907,86],{"class":79},[41,1909,794],{"class":58},[41,1911,80],{"class":79},[41,1913,799],{"class":58},[41,1915,802],{"class":47},[41,1917,805],{"class":785},[41,1919,808],{"class":58},[41,1921,86],{"class":79},[41,1923,813],{"class":47},[41,1925,237],{"class":62},[41,1927,1929,1931,1933,1935],{"class":43,"data-line":1928,"line":1928},62,[41,1930,70],{"class":69},[41,1932,70],{"class":69},[41,1934,70],{"class":69},[41,1936,826],{"class":47},[41,1938,1940,1942,1944,1946],{"class":43,"data-line":1939,"line":1939},63,[41,1941,70],{"class":69},[41,1943,70],{"class":69},[41,1945,36],{"class":58},[41,1947,119],{"class":428},[41,1949,1951,1953,1955],{"class":43,"data-line":1950,"line":1950},64,[41,1952,70],{"class":69},[41,1954,36],{"class":58},[41,1956,119],{"class":79},[41,1958,1960],{"class":43,"data-line":1959,"line":1959},65,[41,1961,119],{"class":62},[41,1963,1965],{"class":43,"data-line":1964,"line":1964},66,[41,1966,487],{"emptyLinePlaceholder":486},[41,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988,1990,1992,1994,1996,1998,2000,2002,2004],{"class":43,"data-line":1969,"line":1969},67,[41,1971,307],{"class":47},[41,1973,59],{"class":58},[41,1975,215],{"class":62},[41,1977,314],{"class":218},[41,1979,89],{"class":47},[41,1981,319],{"class":51},[41,1983,322],{"class":62},[41,1985,59],{"class":58},[41,1987,267],{"class":51},[41,1989,215],{"class":62},[41,1991,219],{"class":218},[41,1993,222],{"class":47},[41,1995,225],{"class":58},[41,1997,278],{"class":218},[41,1999,234],{"class":47},[41,2001,322],{"class":62},[41,2003,59],{"class":58},[41,2005,63],{"class":62},[41,2007,2009,2011],{"class":43,"data-line":2008,"line":2008},68,[41,2010,70],{"class":69},[41,2012,915],{"class":95},[41,2014,2016,2018,2020,2022,2024],{"class":43,"data-line":2015,"line":2015},69,[41,2017,70],{"class":69},[41,2019,366],{"class":58},[41,2021,924],{"class":51},[41,2023,215],{"class":79},[41,2025,237],{"class":79},[41,2027,2029,2031,2033,2035,2037,2039,2041],{"class":43,"data-line":2028,"line":2028},70,[41,2030,70],{"class":69},[41,2032,380],{"class":58},[41,2034,383],{"class":47},[41,2036,386],{"class":58},[41,2038,80],{"class":79},[41,2040,219],{"class":58},[41,2042,393],{"class":79},[41,2044,2046,2048,2050,2052,2054],{"class":43,"data-line":2045,"line":2045},71,[41,2047,70],{"class":69},[41,2049,366],{"class":58},[41,2051,953],{"class":51},[41,2053,215],{"class":79},[41,2055,237],{"class":79},[41,2057,2059,2061,2063,2065,2067],{"class":43,"data-line":2058,"line":2058},72,[41,2060,70],{"class":69},[41,2062,400],{"class":47},[41,2064,403],{"class":47},[41,2066,406],{"class":58},[41,2068,63],{"class":79},[41,2070,2072,2074,2076,2078],{"class":43,"data-line":2071,"line":2071},73,[41,2073,70],{"class":69},[41,2075,70],{"class":69},[41,2077,546],{"class":47},[41,2079,685],{"class":95},[41,2081,2083,2085,2087],{"class":43,"data-line":2082,"line":2082},74,[41,2084,70],{"class":69},[41,2086,36],{"class":58},[41,2088,119],{"class":79},[41,2090,2092],{"class":43,"data-line":2091,"line":2091},75,[41,2093,487],{"emptyLinePlaceholder":486},[41,2095,2097,2099],{"class":43,"data-line":2096,"line":2096},76,[41,2098,70],{"class":69},[41,2100,998],{"class":95},[41,2102,2104,2106,2108,2110,2112],{"class":43,"data-line":2103,"line":2103},77,[41,2105,70],{"class":69},[41,2107,495],{"class":58},[41,2109,924],{"class":51},[41,2111,215],{"class":79},[41,2113,237],{"class":79},[41,2115,2117,2119,2121,2123,2125,2127],{"class":43,"data-line":2116,"line":2116},78,[41,2118,70],{"class":69},[41,2120,509],{"class":47},[41,2122,512],{"class":58},[41,2124,953],{"class":51},[41,2126,215],{"class":79},[41,2128,237],{"class":79},[41,2130,2132,2134,2136,2138,2140,2142,2144],{"class":43,"data-line":2131,"line":2131},79,[41,2133,70],{"class":69},[41,2135,730],{"class":47},[41,2137,1033],{"class":58},[41,2139,383],{"class":47},[41,2141,738],{"class":47},[41,2143,741],{"class":58},[41,2145,63],{"class":79},[41,2147,2149,2151,2153,2155,2157,2159],{"class":43,"data-line":2148,"line":2148},80,[41,2150,70],{"class":69},[41,2152,70],{"class":69},[41,2154,1050],{"class":58},[41,2156,1053],{"class":47},[41,2158,1056],{"class":47},[41,2160,1059],{"class":58},[41,2162,2164,2166,2168],{"class":43,"data-line":2163,"line":2163},81,[41,2165,70],{"class":69},[41,2167,36],{"class":58},[41,2169,119],{"class":79},[41,2171,2173],{"class":43,"data-line":2172,"line":2172},82,[41,2174,119],{"class":62},[41,2176,2178],{"class":43,"data-line":2177,"line":2177},83,[41,2179,487],{"emptyLinePlaceholder":486},[41,2181,2183,2185,2188,2190,2193,2196,2198,2200,2202],{"class":43,"data-line":2182,"line":2182},84,[41,2184,307],{"class":47},[41,2186,2187],{"class":51}," subscribe",[41,2189,215],{"class":62},[41,2191,2192],{"class":218},"eb",[41,2194,2195],{"class":47}," *",[41,2197,319],{"class":51},[41,2199,322],{"class":62},[41,2201,59],{"class":58},[41,2203,63],{"class":62},[41,2205,2207,2209,2211,2213,2216,2218,2220,2222,2224,2226],{"class":43,"data-line":2206,"line":2206},85,[41,2208,70],{"class":69},[41,2210,1050],{"class":58},[41,2212,383],{"class":47},[41,2214,2215],{"class":51}," make",[41,2217,215],{"class":79},[41,2219,160],{"class":47},[41,2221,234],{"class":47},[41,2223,225],{"class":58},[41,2225,805],{"class":785},[41,2227,237],{"class":79},[41,2229,2231,2233,2236,2238,2240,2243,2246],{"class":43,"data-line":2230,"line":2230},86,[41,2232,70],{"class":69},[41,2234,2235],{"class":58},"eb.",[41,2237,212],{"class":51},[41,2239,215],{"class":79},[41,2241,2242],{"class":1118},"\"event1\"",[41,2244,2245],{"class":58},", ch",[41,2247,237],{"class":79},[41,2249,2251,2253,2256,2259,2261],{"class":43,"data-line":2250,"line":2250},87,[41,2252,70],{"class":69},[41,2254,2255],{"class":58},"wg.",[41,2257,2258],{"class":51},"Done",[41,2260,215],{"class":79},[41,2262,237],{"class":79},[41,2264,2266,2268,2271,2274,2276,2279],{"class":43,"data-line":2265,"line":2265},88,[41,2267,70],{"class":69},[41,2269,2270],{"class":58},"fmt.",[41,2272,2273],{"class":51},"Println",[41,2275,215],{"class":79},[41,2277,2278],{"class":1118},"\"订阅完毕，开始等待接收\"",[41,2280,237],{"class":79},[41,2282,2284,2286,2288,2290,2292,2295,2297,2299,2301,2303],{"class":43,"data-line":2283,"line":2283},89,[41,2285,70],{"class":69},[41,2287,2270],{"class":58},[41,2289,2273],{"class":51},[41,2291,215],{"class":79},[41,2293,2294],{"class":1118},"\"接收到值:\"",[41,2296,225],{"class":58},[41,2298,1053],{"class":47},[41,2300,1056],{"class":47},[41,2302,228],{"class":58},[41,2304,237],{"class":79},[41,2306,2308],{"class":43,"data-line":2307,"line":2307},90,[41,2309,119],{"class":62},[41,2311,2313],{"class":43,"data-line":2312,"line":2312},91,[41,2314,487],{"emptyLinePlaceholder":486},[41,2316,2318,2321,2324,2326,2328],{"class":43,"data-line":2317,"line":2317},92,[41,2319,2320],{"class":47},"var",[41,2322,2323],{"class":58}," wg ",[41,2325,107],{"class":51},[41,2327,110],{"class":58},[41,2329,2330],{"class":51},"WaitGroup\n",[41,2332,2334],{"class":43,"data-line":2333,"line":2333},93,[41,2335,487],{"emptyLinePlaceholder":486},[41,2337,2339,2341,2344,2346,2348,2350],{"class":43,"data-line":2338,"line":2338},94,[41,2340,307],{"class":47},[41,2342,2343],{"class":51}," main",[41,2345,215],{"class":62},[41,2347,322],{"class":62},[41,2349,59],{"class":58},[41,2351,63],{"class":62},[41,2353,2355,2357,2359,2361,2363,2365],{"class":43,"data-line":2354,"line":2354},95,[41,2356,70],{"class":69},[41,2358,314],{"class":58},[41,2360,383],{"class":47},[41,2362,1260],{"class":51},[41,2364,215],{"class":79},[41,2366,237],{"class":79},[41,2368,2370,2372,2374,2376,2378,2380],{"class":43,"data-line":2369,"line":2369},96,[41,2371,70],{"class":69},[41,2373,35],{"class":47},[41,2375,2187],{"class":51},[41,2377,215],{"class":79},[41,2379,2192],{"class":58},[41,2381,237],{"class":79},[41,2383,2385],{"class":43,"data-line":2384,"line":2384},97,[41,2386,487],{"emptyLinePlaceholder":486},[41,2388,2390,2392],{"class":43,"data-line":2389,"line":2389},98,[41,2391,70],{"class":69},[41,2393,2394],{"class":95},"\u002F\u002F 发布事件\n",[41,2396,2398],{"class":43,"data-line":2397,"line":2397},99,[41,2399,487],{"emptyLinePlaceholder":486},[41,2401,2403,2405,2407,2410,2412,2414],{"class":43,"data-line":2402,"line":2402},100,[41,2404,70],{"class":69},[41,2406,2255],{"class":58},[41,2408,2409],{"class":51},"Add",[41,2411,215],{"class":79},[41,2413,805],{"class":785},[41,2415,237],{"class":79},[41,2417,2419,2421,2423,2426,2428,2430,2432],{"class":43,"data-line":2418,"line":2418},101,[41,2420,70],{"class":69},[41,2422,2255],{"class":58},[41,2424,2425],{"class":51},"Wait",[41,2427,215],{"class":79},[41,2429,322],{"class":79},[41,2431,59],{"class":58},[41,2433,2434],{"class":95},"\u002F\u002F 等待订阅成功\n",[41,2436,2438,2440,2442,2444,2446,2448,2450,2453],{"class":43,"data-line":2437,"line":2437},102,[41,2439,70],{"class":69},[41,2441,2235],{"class":58},[41,2443,267],{"class":51},[41,2445,215],{"class":79},[41,2447,2242],{"class":1118},[41,2449,225],{"class":58},[41,2451,2452],{"class":785},"666",[41,2454,237],{"class":79},[41,2456,2458,2460,2463,2466,2468,2471],{"class":43,"data-line":2457,"line":2457},103,[41,2459,70],{"class":69},[41,2461,2462],{"class":58},"time.",[41,2464,2465],{"class":51},"Sleep",[41,2467,215],{"class":79},[41,2469,2470],{"class":58},"time.Second",[41,2472,237],{"class":79},[41,2474,2476],{"class":43,"data-line":2475,"line":2475},104,[41,2477,119],{"class":62},[27,2479,2480],{},"上述程序是萌新在学习 channel 的一个案例，如果有不足的的地方请指出",[2482,2483,2484],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}",{"title":36,"searchDepth":116,"depth":116,"links":2486},[2487,2488,2489,2494],{"id":12,"depth":66,"text":12},{"id":186,"depth":66,"text":186},{"id":293,"depth":66,"text":293,"children":2490},[2491,2492,2493],{"id":297,"depth":99,"text":297},{"id":571,"depth":99,"text":571},{"id":865,"depth":99,"text":865},{"id":1084,"depth":66,"text":1084},[2496],"Go语言","2025-08-07","本文介绍了一个适用于单机模块的 Go 语言事件总线（Eventbus）实现，用于异步事件的发布与订阅。通过 map[string]*EventChans 管理事件与多个通道的映射关系，并结合读写锁 sync.RWMutex 保证并发安全，实现了 Subscribe、UnSubscribe、Publish 三个核心方法，展示了如何安全高效地进行事件分发。适合 Go 初学者理解 channel 和并发控制。",false,"md",null,{"slots":2503},{},"\u002F2025\u002F08\u002Fgo-channel5",{"text":2506,"minutes":2507,"time":2508,"words":2509},"6 min read",5.125,307500,1025,{"title":5,"description":2498},{"loc":2504},"posts\u002F2025\u002F08\u002Fgo-channel5",[2514],"channel","tech","2025-08-08","7GHHCK71AIC_mj_b33pVWZ9RA13CSir7bHZTX5aFqJU",[2519,2524],{"title":2520,"path":2521,"stem":2522,"date":2523,"type":2515,"children":-1},"Go Channel 的 Select Case 用法","\u002F2025\u002F08\u002Fgo-channel4","posts\u002F2025\u002F08\u002Fgo-channel4","2025-08-05",{"title":2525,"path":2526,"stem":2527,"date":2497,"type":2515,"children":-1},"Go Panic 与 Recover 异常处理","\u002F2025\u002F08\u002Fgo-panic","posts\u002F2025\u002F08\u002Fgo-panic",1786555056417]