[{"data":1,"prerenderedAt":998},["ShallowReactive",2],{"content:\u002F2025\u002F08\u002Fgo-channel1":3,"surround:\u002F2025\u002F08\u002Fgo-channel1":988},{"id":4,"title":5,"body":6,"categories":966,"date":968,"description":969,"draft":970,"extension":971,"image":972,"meta":973,"navigation":72,"path":975,"permalink":972,"published":972,"readingTime":976,"recommend":972,"references":972,"seo":981,"sitemap":982,"stem":983,"tags":984,"type":986,"updated":968,"__hash__":987},"content\u002Fposts\u002F2025\u002F08\u002Fgo-channel1.md","Go Channel 基础概念与用法",{"type":7,"value":8,"toc":961},"minimark",[9,13,17,20,104,107,110,114,117,483,486,494,506,541,544,547,553,557,560,866,868,945,951,954,957],[10,11,12],"p",{},"chan 是 golang 中的数据结构，俗称管道，用于并发控制和阻塞，其实不也不太懂一步步来",[14,15,16],"h2",{"id":16},"创建",[10,18,19],{},"channel 只能使用 make 来创建",[21,22,27],"pre",{"className":23,"code":24,"language":25,"meta":26,"style":26},"language-go shiki shiki-themes github-light github-dark","c := make(chan int) \u002F\u002F 创建无缓冲区的chan\n\nc2 := make(chan int,2) \u002F\u002F 创建2个缓冲区的chan\n","go","",[28,29,30,67,74],"code",{"__ignoreMap":26},[31,32,35,39,43,47,51,54,57,60,63],"span",{"class":33,"data-line":34,"line":34},"line",1,[31,36,38],{"class":37},"sVt8B","c ",[31,40,42],{"class":41},"szBVR",":=",[31,44,46],{"class":45},"sScJk"," make",[31,48,50],{"class":49},"sSDpw","(",[31,52,53],{"class":41},"chan",[31,55,56],{"class":41}," int",[31,58,59],{"class":49},")",[31,61,62],{"class":37}," ",[31,64,66],{"class":65},"sJ8bj","\u002F\u002F 创建无缓冲区的chan\n",[31,68,70],{"class":33,"data-line":69,"line":69},2,[31,71,73],{"emptyLinePlaceholder":72},true,"\n",[31,75,77,80,82,84,86,88,90,93,97,99,101],{"class":33,"data-line":76,"line":76},3,[31,78,79],{"class":37},"c2 ",[31,81,42],{"class":41},[31,83,46],{"class":45},[31,85,50],{"class":49},[31,87,53],{"class":41},[31,89,56],{"class":41},[31,91,92],{"class":37},",",[31,94,96],{"class":95},"sj4cs","2",[31,98,59],{"class":49},[31,100,62],{"class":37},[31,102,103],{"class":65},"\u002F\u002F 创建2个缓冲区的chan\n",[10,105,106],{},"这个无缓冲区的 channel 一旦接收了值就会在当前 goroutines 阻塞",[10,108,109],{},"所以一般配合 goroutines 在后台使用",[14,111,113],{"id":112},"无缓冲区的-channel","无缓冲区的 channel",[10,115,116],{},"无缓冲区的 channel 在一个地方接收值只能等待接收方接收才能进行下一次读入",[21,118,120],{"className":23,"code":119,"language":25,"meta":26,"style":26},"package main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\tc := make(chan int)\n\tgo func() {\n\t\tfmt.Println(\"[Goroutine] Send 1\")\n\t\tc \u003C- 1\n\t\tfmt.Println(\"[Goroutine] Send 2\")\n\t\tc \u003C- 2\n\t}()\n\n\ttime.Sleep(time.Millisecond * 10) \u002F\u002F 稍等，确保 goroutine 启动\n\n\tfmt.Println(\"[Main] Receive 1\")\n\tv1 := \u003C-c\n\tfmt.Println(\"[Main] Got:\", v1)\n\n\tfmt.Println(\"[Main] Receive 2\")\n\tv2 := \u003C-c\n\tfmt.Println(\"[Main] Got:\", v2)\n}\n",[28,121,122,130,134,144,161,173,179,184,202,222,240,261,279,297,313,327,332,361,366,382,401,420,425,441,459,477],{"__ignoreMap":26},[31,123,124,127],{"class":33,"data-line":34,"line":34},[31,125,126],{"class":41},"package",[31,128,129],{"class":45}," main\n",[31,131,132],{"class":33,"data-line":69,"line":69},[31,133,73],{"emptyLinePlaceholder":72},[31,135,136,139,141],{"class":33,"data-line":76,"line":76},[31,137,138],{"class":41},"import",[31,140,62],{"class":37},[31,142,143],{"class":49},"(\n",[31,145,147,151,155,158],{"class":33,"data-line":146,"line":146},4,[31,148,150],{"class":149},"indent","\t",[31,152,154],{"class":153},"sZZnC","\"",[31,156,157],{"class":45},"fmt",[31,159,160],{"class":153},"\"\n",[31,162,164,166,168,171],{"class":33,"data-line":163,"line":163},5,[31,165,150],{"class":149},[31,167,154],{"class":153},[31,169,170],{"class":45},"time",[31,172,160],{"class":153},[31,174,176],{"class":33,"data-line":175,"line":175},6,[31,177,178],{"class":49},")\n",[31,180,182],{"class":33,"data-line":181,"line":181},7,[31,183,73],{"emptyLinePlaceholder":72},[31,185,187,190,193,195,197,199],{"class":33,"data-line":186,"line":186},8,[31,188,189],{"class":41},"func",[31,191,192],{"class":45}," main",[31,194,50],{"class":49},[31,196,59],{"class":49},[31,198,62],{"class":37},[31,200,201],{"class":49},"{\n",[31,203,205,207,209,211,213,216,218,220],{"class":33,"data-line":204,"line":204},9,[31,206,150],{"class":149},[31,208,38],{"class":37},[31,210,42],{"class":41},[31,212,46],{"class":45},[31,214,50],{"class":215},"sJX2D",[31,217,53],{"class":41},[31,219,56],{"class":41},[31,221,178],{"class":215},[31,223,225,227,229,232,234,236,238],{"class":33,"data-line":224,"line":224},10,[31,226,150],{"class":149},[31,228,25],{"class":41},[31,230,231],{"class":41}," func",[31,233,50],{"class":215},[31,235,59],{"class":215},[31,237,62],{"class":37},[31,239,201],{"class":215},[31,241,243,245,247,250,253,256,259],{"class":33,"data-line":242,"line":242},11,[31,244,150],{"class":149},[31,246,150],{"class":149},[31,248,249],{"class":37},"fmt.",[31,251,252],{"class":45},"Println",[31,254,50],{"class":255},"sqkie",[31,257,258],{"class":153},"\"[Goroutine] Send 1\"",[31,260,178],{"class":255},[31,262,264,266,268,270,273,276],{"class":33,"data-line":263,"line":263},12,[31,265,150],{"class":149},[31,267,150],{"class":149},[31,269,38],{"class":37},[31,271,272],{"class":41},"\u003C",[31,274,275],{"class":41},"-",[31,277,278],{"class":95}," 1\n",[31,280,282,284,286,288,290,292,295],{"class":33,"data-line":281,"line":281},13,[31,283,150],{"class":149},[31,285,150],{"class":149},[31,287,249],{"class":37},[31,289,252],{"class":45},[31,291,50],{"class":255},[31,293,294],{"class":153},"\"[Goroutine] Send 2\"",[31,296,178],{"class":255},[31,298,300,302,304,306,308,310],{"class":33,"data-line":299,"line":299},14,[31,301,150],{"class":149},[31,303,150],{"class":149},[31,305,38],{"class":37},[31,307,272],{"class":41},[31,309,275],{"class":41},[31,311,312],{"class":95}," 2\n",[31,314,316,318,320,323,325],{"class":33,"data-line":315,"line":315},15,[31,317,150],{"class":149},[31,319,26],{"class":37},[31,321,322],{"class":215},"}",[31,324,50],{"class":215},[31,326,178],{"class":215},[31,328,330],{"class":33,"data-line":329,"line":329},16,[31,331,73],{"emptyLinePlaceholder":72},[31,333,335,337,340,343,345,348,351,354,356,358],{"class":33,"data-line":334,"line":334},17,[31,336,150],{"class":149},[31,338,339],{"class":37},"time.",[31,341,342],{"class":45},"Sleep",[31,344,50],{"class":215},[31,346,347],{"class":37},"time.Millisecond ",[31,349,350],{"class":41},"*",[31,352,353],{"class":95}," 10",[31,355,59],{"class":215},[31,357,62],{"class":37},[31,359,360],{"class":65},"\u002F\u002F 稍等，确保 goroutine 启动\n",[31,362,364],{"class":33,"data-line":363,"line":363},18,[31,365,73],{"emptyLinePlaceholder":72},[31,367,369,371,373,375,377,380],{"class":33,"data-line":368,"line":368},19,[31,370,150],{"class":149},[31,372,249],{"class":37},[31,374,252],{"class":45},[31,376,50],{"class":215},[31,378,379],{"class":153},"\"[Main] Receive 1\"",[31,381,178],{"class":215},[31,383,385,387,390,392,394,396,398],{"class":33,"data-line":384,"line":384},20,[31,386,150],{"class":149},[31,388,389],{"class":37},"v1 ",[31,391,42],{"class":41},[31,393,62],{"class":41},[31,395,272],{"class":41},[31,397,275],{"class":41},[31,399,400],{"class":37},"c\n",[31,402,404,406,408,410,412,415,418],{"class":33,"data-line":403,"line":403},21,[31,405,150],{"class":149},[31,407,249],{"class":37},[31,409,252],{"class":45},[31,411,50],{"class":215},[31,413,414],{"class":153},"\"[Main] Got:\"",[31,416,417],{"class":37},", v1",[31,419,178],{"class":215},[31,421,423],{"class":33,"data-line":422,"line":422},22,[31,424,73],{"emptyLinePlaceholder":72},[31,426,428,430,432,434,436,439],{"class":33,"data-line":427,"line":427},23,[31,429,150],{"class":149},[31,431,249],{"class":37},[31,433,252],{"class":45},[31,435,50],{"class":215},[31,437,438],{"class":153},"\"[Main] Receive 2\"",[31,440,178],{"class":215},[31,442,444,446,449,451,453,455,457],{"class":33,"data-line":443,"line":443},24,[31,445,150],{"class":149},[31,447,448],{"class":37},"v2 ",[31,450,42],{"class":41},[31,452,62],{"class":41},[31,454,272],{"class":41},[31,456,275],{"class":41},[31,458,400],{"class":37},[31,460,462,464,466,468,470,472,475],{"class":33,"data-line":461,"line":461},25,[31,463,150],{"class":149},[31,465,249],{"class":37},[31,467,252],{"class":45},[31,469,50],{"class":215},[31,471,414],{"class":153},[31,473,474],{"class":37},", v2",[31,476,178],{"class":215},[31,478,480],{"class":33,"data-line":479,"line":479},26,[31,481,482],{"class":49},"}\n",[10,484,485],{},"执行结果：",[21,487,492],{"className":488,"code":490,"language":491,"meta":26},[489],"language-text","[Goroutine] Send 1\n[Main] Receive 1\n[Main] Got: 1\n[Main] Receive 2\n[Goroutine] Send 2\n[Main] Got: 2\n","text",[28,493,490],{"__ignoreMap":26},[10,495,496,497,501,502,505],{},"正如上述代码所示，往 ",[498,499,500],"strong",{},"无缓冲的"," channel 置入值，接收值这个过程会阻塞当前",[28,503,504],{"code":504},"goroutine","，直到在另外一个 goroutine 拿到为止",[21,507,509],{"className":23,"code":508,"language":25,"meta":26,"style":26},"v3 := \u003C-c\nfmt.Println(\"[Main] Got:\", v3)\n",[28,510,511,526],{"__ignoreMap":26},[31,512,513,516,518,520,522,524],{"class":33,"data-line":34,"line":34},[31,514,515],{"class":37},"v3 ",[31,517,42],{"class":41},[31,519,62],{"class":41},[31,521,272],{"class":41},[31,523,275],{"class":41},[31,525,400],{"class":37},[31,527,528,530,532,534,536,539],{"class":33,"data-line":69,"line":69},[31,529,249],{"class":37},[31,531,252],{"class":45},[31,533,50],{"class":49},[31,535,414],{"class":153},[31,537,538],{"class":37},", v3",[31,540,178],{"class":49},[10,542,543],{},"如果写成这样那么就会持续阻塞，造成死锁问题",[10,545,546],{},"控制台的输出为",[21,548,551],{"className":549,"code":550,"language":491,"meta":26},[489],"fatal error: all goroutines are asleep - deadlock!\n]:\nmain.main()\n        \u002Fcode\u002Fdemo\u002Feventbus\u002F1.go:27 +0x214\n",[28,552,550],{"__ignoreMap":26},[14,554,556],{"id":555},"有缓冲区的-channel","有缓冲区的 channel",[10,558,559],{},"与无缓冲区的 channel 不同的是，有缓冲区的 channel 内部是可以存储值的，如果在没有接收方时，依旧是可以往 channel 发送值，直到发送的值的个数等于缓冲区容量的时候，channel 就会被阻塞",[21,561,563],{"className":23,"code":562,"language":25,"meta":26,"style":26},"package main\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\nfunc main() {\n\tc := make(chan int, 2)\n\tgo func() {\n\t\tfmt.Println(\"[Goroutine] Send 1\")\n\t\tc \u003C- 1\n\t\tfmt.Println(\"[Goroutine] Send 2\")\n\t\tc \u003C- 2\n\t}()\n\n\ttime.Sleep(time.Millisecond * 10) \u002F\u002F 稍等，确保 goroutine 启动\n\n\tfmt.Println(\"[Main] Receive 1\")\n\tv1 := \u003C-c\n\tfmt.Println(\"[Main] Got:\", v1)\n\n\tfmt.Println(\"[Main] Receive 2\")\n\tv2 := \u003C-c\n\tfmt.Println(\"[Main] Got:\", v2)\n}\n",[28,564,565,571,575,583,593,603,607,611,625,648,664,680,694,710,724,736,740,762,766,780,796,812,816,830,846,862],{"__ignoreMap":26},[31,566,567,569],{"class":33,"data-line":34,"line":34},[31,568,126],{"class":41},[31,570,129],{"class":45},[31,572,573],{"class":33,"data-line":69,"line":69},[31,574,73],{"emptyLinePlaceholder":72},[31,576,577,579,581],{"class":33,"data-line":76,"line":76},[31,578,138],{"class":41},[31,580,62],{"class":37},[31,582,143],{"class":49},[31,584,585,587,589,591],{"class":33,"data-line":146,"line":146},[31,586,150],{"class":149},[31,588,154],{"class":153},[31,590,157],{"class":45},[31,592,160],{"class":153},[31,594,595,597,599,601],{"class":33,"data-line":163,"line":163},[31,596,150],{"class":149},[31,598,154],{"class":153},[31,600,170],{"class":45},[31,602,160],{"class":153},[31,604,605],{"class":33,"data-line":175,"line":175},[31,606,178],{"class":49},[31,608,609],{"class":33,"data-line":181,"line":181},[31,610,73],{"emptyLinePlaceholder":72},[31,612,613,615,617,619,621,623],{"class":33,"data-line":186,"line":186},[31,614,189],{"class":41},[31,616,192],{"class":45},[31,618,50],{"class":49},[31,620,59],{"class":49},[31,622,62],{"class":37},[31,624,201],{"class":49},[31,626,627,629,631,633,635,637,639,641,644,646],{"class":33,"data-line":204,"line":204},[31,628,150],{"class":149},[31,630,38],{"class":37},[31,632,42],{"class":41},[31,634,46],{"class":45},[31,636,50],{"class":215},[31,638,53],{"class":41},[31,640,56],{"class":41},[31,642,643],{"class":37},", ",[31,645,96],{"class":95},[31,647,178],{"class":215},[31,649,650,652,654,656,658,660,662],{"class":33,"data-line":224,"line":224},[31,651,150],{"class":149},[31,653,25],{"class":41},[31,655,231],{"class":41},[31,657,50],{"class":215},[31,659,59],{"class":215},[31,661,62],{"class":37},[31,663,201],{"class":215},[31,665,666,668,670,672,674,676,678],{"class":33,"data-line":242,"line":242},[31,667,150],{"class":149},[31,669,150],{"class":149},[31,671,249],{"class":37},[31,673,252],{"class":45},[31,675,50],{"class":255},[31,677,258],{"class":153},[31,679,178],{"class":255},[31,681,682,684,686,688,690,692],{"class":33,"data-line":263,"line":263},[31,683,150],{"class":149},[31,685,150],{"class":149},[31,687,38],{"class":37},[31,689,272],{"class":41},[31,691,275],{"class":41},[31,693,278],{"class":95},[31,695,696,698,700,702,704,706,708],{"class":33,"data-line":281,"line":281},[31,697,150],{"class":149},[31,699,150],{"class":149},[31,701,249],{"class":37},[31,703,252],{"class":45},[31,705,50],{"class":255},[31,707,294],{"class":153},[31,709,178],{"class":255},[31,711,712,714,716,718,720,722],{"class":33,"data-line":299,"line":299},[31,713,150],{"class":149},[31,715,150],{"class":149},[31,717,38],{"class":37},[31,719,272],{"class":41},[31,721,275],{"class":41},[31,723,312],{"class":95},[31,725,726,728,730,732,734],{"class":33,"data-line":315,"line":315},[31,727,150],{"class":149},[31,729,26],{"class":37},[31,731,322],{"class":215},[31,733,50],{"class":215},[31,735,178],{"class":215},[31,737,738],{"class":33,"data-line":329,"line":329},[31,739,73],{"emptyLinePlaceholder":72},[31,741,742,744,746,748,750,752,754,756,758,760],{"class":33,"data-line":334,"line":334},[31,743,150],{"class":149},[31,745,339],{"class":37},[31,747,342],{"class":45},[31,749,50],{"class":215},[31,751,347],{"class":37},[31,753,350],{"class":41},[31,755,353],{"class":95},[31,757,59],{"class":215},[31,759,62],{"class":37},[31,761,360],{"class":65},[31,763,764],{"class":33,"data-line":363,"line":363},[31,765,73],{"emptyLinePlaceholder":72},[31,767,768,770,772,774,776,778],{"class":33,"data-line":368,"line":368},[31,769,150],{"class":149},[31,771,249],{"class":37},[31,773,252],{"class":45},[31,775,50],{"class":215},[31,777,379],{"class":153},[31,779,178],{"class":215},[31,781,782,784,786,788,790,792,794],{"class":33,"data-line":384,"line":384},[31,783,150],{"class":149},[31,785,389],{"class":37},[31,787,42],{"class":41},[31,789,62],{"class":41},[31,791,272],{"class":41},[31,793,275],{"class":41},[31,795,400],{"class":37},[31,797,798,800,802,804,806,808,810],{"class":33,"data-line":403,"line":403},[31,799,150],{"class":149},[31,801,249],{"class":37},[31,803,252],{"class":45},[31,805,50],{"class":215},[31,807,414],{"class":153},[31,809,417],{"class":37},[31,811,178],{"class":215},[31,813,814],{"class":33,"data-line":422,"line":422},[31,815,73],{"emptyLinePlaceholder":72},[31,817,818,820,822,824,826,828],{"class":33,"data-line":427,"line":427},[31,819,150],{"class":149},[31,821,249],{"class":37},[31,823,252],{"class":45},[31,825,50],{"class":215},[31,827,438],{"class":153},[31,829,178],{"class":215},[31,831,832,834,836,838,840,842,844],{"class":33,"data-line":443,"line":443},[31,833,150],{"class":149},[31,835,448],{"class":37},[31,837,42],{"class":41},[31,839,62],{"class":41},[31,841,272],{"class":41},[31,843,275],{"class":41},[31,845,400],{"class":37},[31,847,848,850,852,854,856,858,860],{"class":33,"data-line":461,"line":461},[31,849,150],{"class":149},[31,851,249],{"class":37},[31,853,252],{"class":45},[31,855,50],{"class":215},[31,857,414],{"class":153},[31,859,474],{"class":37},[31,861,178],{"class":215},[31,863,864],{"class":33,"data-line":479,"line":479},[31,865,482],{"class":49},[10,867,485],{},[21,869,873],{"className":870,"code":871,"language":872,"meta":26,"style":26},"language-bash shiki shiki-themes github-light github-dark","[Goroutine] Send 1\n[Goroutine] Send 2\n[Main] Receive 1\n[Main] Got: 1\n[Main] Receive 2\n[Main] Got: 2\n","bash",[28,874,875,889,900,912,923,934],{"__ignoreMap":26},[31,876,877,880,883,886],{"class":33,"data-line":34,"line":34},[31,878,879],{"class":49},"[",[31,881,882],{"class":37},"Goroutine",[31,884,885],{"class":49},"]",[31,887,888],{"class":37}," Send 1\n",[31,890,891,893,895,897],{"class":33,"data-line":69,"line":69},[31,892,879],{"class":49},[31,894,882],{"class":37},[31,896,885],{"class":49},[31,898,899],{"class":37}," Send 2\n",[31,901,902,904,907,909],{"class":33,"data-line":76,"line":76},[31,903,879],{"class":49},[31,905,906],{"class":37},"Main",[31,908,885],{"class":49},[31,910,911],{"class":37}," Receive 1\n",[31,913,914,916,918,920],{"class":33,"data-line":146,"line":146},[31,915,879],{"class":49},[31,917,906],{"class":37},[31,919,885],{"class":49},[31,921,922],{"class":37}," Got: 1\n",[31,924,925,927,929,931],{"class":33,"data-line":163,"line":163},[31,926,879],{"class":49},[31,928,906],{"class":37},[31,930,885],{"class":49},[31,932,933],{"class":37}," Receive 2\n",[31,935,936,938,940,942],{"class":33,"data-line":175,"line":175},[31,937,879],{"class":49},[31,939,906],{"class":37},[31,941,885],{"class":49},[31,943,944],{"class":37}," Got: 2\n",[10,946,947,948,950],{},"可以发现，有缓冲区并不像无缓冲区那样，在置入一个值就会阻塞，当前",[28,949,504],{"code":504}," 会被挂起，有缓冲区的 channel 可以往内部置入多个值，仅当发送个数等于其缓冲区容量的时候，才会被挂起",[10,952,953],{},"所以无缓冲区是同步的，在消费者消费完才能继续生产\n有缓冲区是异步的，无需等待消费者消费完",[10,955,956],{},"无缓冲区有点像一个共用的杯子，只有牛奶满了，顾客才能购买并且喝完才能继续挤奶\n有缓冲区就是一个车间，可以一直生产牛奶直到车间满为止，消费者是可以直接去车间喝牛奶的",[958,959,960],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sSDpw, html code.shiki .sSDpw{--shiki-default:#005cc5;--shiki-dark:#79b8ff}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJX2D, html code.shiki .sJX2D{--shiki-default:#e36209;--shiki-dark:#ffab70}html pre.shiki code .sqkie, html code.shiki .sqkie{--shiki-default:#5a32a3;--shiki-dark:#b392f0}",{"title":26,"searchDepth":146,"depth":146,"links":962},[963,964,965],{"id":16,"depth":69,"text":16},{"id":112,"depth":69,"text":113},{"id":555,"depth":69,"text":556},[967],"Go语言","2025-08-04","在 Go 语言中，channel 是一种用于**协程间通信**的数据结构。根据是否带缓冲区，channel 可分为**无缓冲区**和**有缓冲区**两类。\n\n**无缓冲区的 channel** 是一种同步通信方式，发送和接收必须“当场配对”，发送方在没有接收方的情况下会被挂起，直到数据被接收。这就像一个共享的杯子，只有顾客喝掉牛奶，奶农才能继续挤下一杯。\n\n**有缓冲区的 channel** 则支持异步通信，可以预先存入一定数量的值，只在缓冲区满时才会阻塞发送。它更像一个小型车间，奶农可以提前挤奶放进去，顾客随时取用。\n\n理解这两者的差异对于编写高效的并发程序非常关键，尤其是在处理 goroutine 调度与通信时。\n",false,"md",null,{"slots":974},{},"\u002F2025\u002F08\u002Fgo-channel1",{"text":977,"minutes":978,"time":979,"words":980},"4 min read",3.29,197400,658,{"title":5,"description":969},{"loc":975},"posts\u002F2025\u002F08\u002Fgo-channel1",[985],"channel","tech","ia2pQtgM8XUTJp3qZJKP2YpSs31P4ssxl4dF5n5hYYM",[989,994],{"title":990,"path":991,"stem":992,"date":993,"type":986,"children":-1},"Go 使用 MinIO SDK 上传文件","\u002F2025\u002F07\u002Fgo-minio","posts\u002F2025\u002F07\u002Fgo-minio","2025-07-31",{"title":995,"path":996,"stem":997,"date":968,"type":986,"children":-1},"缓冲区为 1 和无缓冲区的 channel 有什么区别","\u002F2025\u002F08\u002Fgo-channel2","posts\u002F2025\u002F08\u002Fgo-channel2",1786555056489]