[{"data":1,"prerenderedAt":1673},["ShallowReactive",2],{"doc-page:\u002Fdocs\u002Fgo-basics":3},{"doc":4,"prev":1638,"next":1643,"resolvedType":8,"readingMinutes":154,"audience":1647,"checklist":1651,"related":1655},{"path":5,"title":6,"description":7,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":12,"publishedAt":12,"icon":13,"body":14},"\u002Fdocs\u002Fgo-basics","Go 语言入门","Go 安装配置、常用命令、项目结构、并发编程与交叉编译","article",null,"programming-languages","编程语言","2026-02-27","i-carbon-application",{"type":15,"value":16,"toc":1617},"minimark",[17,21,32,35,39,42,69,72,75,106,109,126,129,196,199,280,283,286,294,297,324,327,330,437,440,864,867,870,1221,1224,1228,1231,1234,1237,1241,1244,1255,1262,1265,1371,1374,1421,1424,1504,1507,1538,1541,1544,1564,1568,1577,1580,1613],[18,19,6],"h1",{"id":20},"go-语言入门",[22,23,24,31],"p",{},[25,26,30],"a",{"href":27,"rel":28},"https:\u002F\u002Fgo.dev\u002F",[29],"nofollow","Go"," 是 Google 开发的编译型语言，以简洁、高效和原生并发著称。",[22,33,34],{},"这页适合已经写过一点脚本或后端、准备正式上手 Go 的开发者。建议把它当成“从安装到项目结构再到并发与发布”的入门路线，而不是只记零散语法。",[36,37,38],"h2",{"id":38},"推荐上手顺序",[22,40,41],{},"一个比较顺的学习路径通常是：",[43,44,45,60,63,66],"ol",{},[46,47,48,49,53,54,53,57],"li",{},"先会 ",[50,51,52],"code",{},"go run","、",[50,55,56],{},"go build",[50,58,59],{},"go test",[46,61,62],{},"再理解模块管理与依赖下载",[46,64,65],{},"然后掌握结构体、接口、错误处理",[46,67,68],{},"最后再进入 goroutine、channel、服务端框架与部署",[22,70,71],{},"Go 的关键不是语法多，而是代码组织和工程习惯要尽早建立。",[36,73,74],{"id":74},"安装",[76,77,82],"pre",{"className":78,"code":79,"language":80,"meta":81,"style":81},"language-powershell shiki shiki-themes github-light github-dark","winget install GoLang.Go\n# 或\nscoop install go\n","powershell","",[50,83,84,93,100],{"__ignoreMap":81},[85,86,89],"span",{"class":87,"line":88},"line",1,[85,90,92],{"class":91},"sVt8B","winget install GoLang.Go\n",[85,94,96],{"class":87,"line":95},2,[85,97,99],{"class":98},"sJ8bj","# 或\n",[85,101,103],{"class":87,"line":102},3,[85,104,105],{"class":91},"scoop install go\n",[22,107,108],{},"验证：",[76,110,114],{"className":111,"code":112,"language":113,"meta":81,"style":81},"language-bash shiki shiki-themes github-light github-dark","go version\n","bash",[50,115,116],{"__ignoreMap":81},[85,117,118,122],{"class":87,"line":88},[85,119,121],{"class":120},"sScJk","go",[85,123,125],{"class":124},"sZZnC"," version\n",[36,127,128],{"id":128},"环境配置",[76,130,132],{"className":111,"code":131,"language":113,"meta":81,"style":81},"# 查看环境\ngo env\n\n# 设置代理（国内推荐）\ngo env -w GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\n\n# 启用模块\ngo env -w GO111MODULE=on\n",[50,133,134,139,146,152,158,173,178,184],{"__ignoreMap":81},[85,135,136],{"class":87,"line":88},[85,137,138],{"class":98},"# 查看环境\n",[85,140,141,143],{"class":87,"line":95},[85,142,121],{"class":120},[85,144,145],{"class":124}," env\n",[85,147,148],{"class":87,"line":102},[85,149,151],{"emptyLinePlaceholder":150},true,"\n",[85,153,155],{"class":87,"line":154},4,[85,156,157],{"class":98},"# 设置代理（国内推荐）\n",[85,159,161,163,166,170],{"class":87,"line":160},5,[85,162,121],{"class":120},[85,164,165],{"class":124}," env",[85,167,169],{"class":168},"sj4cs"," -w",[85,171,172],{"class":124}," GOPROXY=https:\u002F\u002Fgoproxy.cn,direct\n",[85,174,176],{"class":87,"line":175},6,[85,177,151],{"emptyLinePlaceholder":150},[85,179,181],{"class":87,"line":180},7,[85,182,183],{"class":98},"# 启用模块\n",[85,185,187,189,191,193],{"class":87,"line":186},8,[85,188,121],{"class":120},[85,190,165],{"class":124},[85,192,169],{"class":168},[85,194,195],{"class":124}," GO111MODULE=on\n",[36,197,198],{"id":198},"项目管理",[76,200,202],{"className":111,"code":201,"language":113,"meta":81,"style":81},"# 初始化模块\ngo mod init github.com\u002Fuser\u002Fproject\n\n# 添加依赖\ngo get github.com\u002Fgin-gonic\u002Fgin\n\n# 整理依赖\ngo mod tidy\n\n# 下载依赖\ngo mod download\n",[50,203,204,209,222,226,231,241,245,250,259,264,270],{"__ignoreMap":81},[85,205,206],{"class":87,"line":88},[85,207,208],{"class":98},"# 初始化模块\n",[85,210,211,213,216,219],{"class":87,"line":95},[85,212,121],{"class":120},[85,214,215],{"class":124}," mod",[85,217,218],{"class":124}," init",[85,220,221],{"class":124}," github.com\u002Fuser\u002Fproject\n",[85,223,224],{"class":87,"line":102},[85,225,151],{"emptyLinePlaceholder":150},[85,227,228],{"class":87,"line":154},[85,229,230],{"class":98},"# 添加依赖\n",[85,232,233,235,238],{"class":87,"line":160},[85,234,121],{"class":120},[85,236,237],{"class":124}," get",[85,239,240],{"class":124}," github.com\u002Fgin-gonic\u002Fgin\n",[85,242,243],{"class":87,"line":175},[85,244,151],{"emptyLinePlaceholder":150},[85,246,247],{"class":87,"line":180},[85,248,249],{"class":98},"# 整理依赖\n",[85,251,252,254,256],{"class":87,"line":186},[85,253,121],{"class":120},[85,255,215],{"class":124},[85,257,258],{"class":124}," tidy\n",[85,260,262],{"class":87,"line":261},9,[85,263,151],{"emptyLinePlaceholder":150},[85,265,267],{"class":87,"line":266},10,[85,268,269],{"class":98},"# 下载依赖\n",[85,271,273,275,277],{"class":87,"line":272},11,[85,274,121],{"class":120},[85,276,215],{"class":124},[85,278,279],{"class":124}," download\n",[36,281,282],{"id":282},"常见目录结构",[22,284,285],{},"小项目可以先从简单结构起步：",[76,287,292],{"className":288,"code":290,"language":291,"meta":81},[289],"language-text","my-app\u002F\n  go.mod\n  main.go\n  internal\u002F\n  pkg\u002F\n  cmd\u002F\n","text",[50,293,290],{"__ignoreMap":81},[22,295,296],{},"可以这样理解：",[298,299,300,312,318],"ul",{},[46,301,302,305,306,53,309],{},[50,303,304],{},"cmd\u002F","：应用入口，例如 ",[50,307,308],{},"cmd\u002Fapi",[50,310,311],{},"cmd\u002Fworker",[46,313,314,317],{},[50,315,316],{},"internal\u002F","：只给当前项目内部使用的代码",[46,319,320,323],{},[50,321,322],{},"pkg\u002F","：准备对外复用、边界更稳定的公共包",[22,325,326],{},"如果项目还很小，不要为了“看起来专业”过度拆目录；先保持清晰，再逐步演进。",[36,328,329],{"id":329},"常用命令",[76,331,333],{"className":111,"code":332,"language":113,"meta":81,"style":81},"go run main.go            # 编译并运行\ngo build                  # 编译\ngo build -o app.exe       # 指定输出名\ngo test .\u002F...             # 运行所有测试\ngo test -v -cover .\u002F...   # 详细输出 + 覆盖率\ngo fmt .\u002F...              # 格式化代码\ngo vet .\u002F...              # 静态分析\ngo install                # 编译并安装到 GOPATH\u002Fbin\n",[50,334,335,348,358,373,386,403,415,427],{"__ignoreMap":81},[85,336,337,339,342,345],{"class":87,"line":88},[85,338,121],{"class":120},[85,340,341],{"class":124}," run",[85,343,344],{"class":124}," main.go",[85,346,347],{"class":98},"            # 编译并运行\n",[85,349,350,352,355],{"class":87,"line":95},[85,351,121],{"class":120},[85,353,354],{"class":124}," build",[85,356,357],{"class":98},"                  # 编译\n",[85,359,360,362,364,367,370],{"class":87,"line":102},[85,361,121],{"class":120},[85,363,354],{"class":124},[85,365,366],{"class":168}," -o",[85,368,369],{"class":124}," app.exe",[85,371,372],{"class":98},"       # 指定输出名\n",[85,374,375,377,380,383],{"class":87,"line":154},[85,376,121],{"class":120},[85,378,379],{"class":124}," test",[85,381,382],{"class":124}," .\u002F...",[85,384,385],{"class":98},"             # 运行所有测试\n",[85,387,388,390,392,395,398,400],{"class":87,"line":160},[85,389,121],{"class":120},[85,391,379],{"class":124},[85,393,394],{"class":168}," -v",[85,396,397],{"class":168}," -cover",[85,399,382],{"class":124},[85,401,402],{"class":98},"   # 详细输出 + 覆盖率\n",[85,404,405,407,410,412],{"class":87,"line":175},[85,406,121],{"class":120},[85,408,409],{"class":124}," fmt",[85,411,382],{"class":124},[85,413,414],{"class":98},"              # 格式化代码\n",[85,416,417,419,422,424],{"class":87,"line":180},[85,418,121],{"class":120},[85,420,421],{"class":124}," vet",[85,423,382],{"class":124},[85,425,426],{"class":98},"              # 静态分析\n",[85,428,429,431,434],{"class":87,"line":186},[85,430,121],{"class":120},[85,432,433],{"class":124}," install",[85,435,436],{"class":98},"                # 编译并安装到 GOPATH\u002Fbin\n",[36,438,439],{"id":439},"基础语法速查",[76,441,444],{"className":442,"code":443,"language":121,"meta":81,"style":81},"language-go shiki shiki-themes github-light github-dark","package main\n\nimport \"fmt\"\n\n\u002F\u002F 变量\nvar name string = \"Domi\"\ncount := 42  \u002F\u002F 短声明\n\n\u002F\u002F 函数\nfunc add(a, b int) int {\n    return a + b\n}\n\n\u002F\u002F 多返回值\nfunc divide(a, b float64) (float64, error) {\n    if b == 0 {\n        return 0, fmt.Errorf(\"division by zero\")\n    }\n    return a \u002F b, nil\n}\n\n\u002F\u002F 结构体\ntype User struct {\n    Name  string `json:\"name\"`\n    Email string `json:\"email\"`\n}\n\nfunc (u User) String() string {\n    return fmt.Sprintf(\"%s \u003C%s>\", u.Name, u.Email)\n}\n\n\u002F\u002F 接口\ntype Reader interface {\n    Read(p []byte) (n int, err error)\n}\n",[50,445,446,455,459,473,477,482,499,513,517,522,554,568,574,579,585,618,635,657,663,679,684,689,695,709,720,731,736,741,767,797,802,807,813,826,859],{"__ignoreMap":81},[85,447,448,452],{"class":87,"line":88},[85,449,451],{"class":450},"szBVR","package",[85,453,454],{"class":120}," main\n",[85,456,457],{"class":87,"line":95},[85,458,151],{"emptyLinePlaceholder":150},[85,460,461,464,467,470],{"class":87,"line":102},[85,462,463],{"class":450},"import",[85,465,466],{"class":124}," \"",[85,468,469],{"class":120},"fmt",[85,471,472],{"class":124},"\"\n",[85,474,475],{"class":87,"line":154},[85,476,151],{"emptyLinePlaceholder":150},[85,478,479],{"class":87,"line":160},[85,480,481],{"class":98},"\u002F\u002F 变量\n",[85,483,484,487,490,493,496],{"class":87,"line":175},[85,485,486],{"class":450},"var",[85,488,489],{"class":91}," name ",[85,491,492],{"class":450},"string",[85,494,495],{"class":450}," =",[85,497,498],{"class":124}," \"Domi\"\n",[85,500,501,504,507,510],{"class":87,"line":180},[85,502,503],{"class":91},"count ",[85,505,506],{"class":450},":=",[85,508,509],{"class":168}," 42",[85,511,512],{"class":98},"  \u002F\u002F 短声明\n",[85,514,515],{"class":87,"line":186},[85,516,151],{"emptyLinePlaceholder":150},[85,518,519],{"class":87,"line":261},[85,520,521],{"class":98},"\u002F\u002F 函数\n",[85,523,524,527,530,533,536,539,542,545,548,551],{"class":87,"line":266},[85,525,526],{"class":450},"func",[85,528,529],{"class":120}," add",[85,531,532],{"class":91},"(",[85,534,25],{"class":535},"s4XuR",[85,537,538],{"class":91},", ",[85,540,541],{"class":535},"b",[85,543,544],{"class":450}," int",[85,546,547],{"class":91},") ",[85,549,550],{"class":450},"int",[85,552,553],{"class":91}," {\n",[85,555,556,559,562,565],{"class":87,"line":272},[85,557,558],{"class":450},"    return",[85,560,561],{"class":91}," a ",[85,563,564],{"class":450},"+",[85,566,567],{"class":91}," b\n",[85,569,571],{"class":87,"line":570},12,[85,572,573],{"class":91},"}\n",[85,575,577],{"class":87,"line":576},13,[85,578,151],{"emptyLinePlaceholder":150},[85,580,582],{"class":87,"line":581},14,[85,583,584],{"class":98},"\u002F\u002F 多返回值\n",[85,586,588,590,593,595,597,599,601,604,607,610,612,615],{"class":87,"line":587},15,[85,589,526],{"class":450},[85,591,592],{"class":120}," divide",[85,594,532],{"class":91},[85,596,25],{"class":535},[85,598,538],{"class":91},[85,600,541],{"class":535},[85,602,603],{"class":450}," float64",[85,605,606],{"class":91},") (",[85,608,609],{"class":450},"float64",[85,611,538],{"class":91},[85,613,614],{"class":450},"error",[85,616,617],{"class":91},") {\n",[85,619,621,624,627,630,633],{"class":87,"line":620},16,[85,622,623],{"class":450},"    if",[85,625,626],{"class":91}," b ",[85,628,629],{"class":450},"==",[85,631,632],{"class":168}," 0",[85,634,553],{"class":91},[85,636,638,641,643,646,649,651,654],{"class":87,"line":637},17,[85,639,640],{"class":450},"        return",[85,642,632],{"class":168},[85,644,645],{"class":91},", fmt.",[85,647,648],{"class":120},"Errorf",[85,650,532],{"class":91},[85,652,653],{"class":124},"\"division by zero\"",[85,655,656],{"class":91},")\n",[85,658,660],{"class":87,"line":659},18,[85,661,662],{"class":91},"    }\n",[85,664,666,668,670,673,676],{"class":87,"line":665},19,[85,667,558],{"class":450},[85,669,561],{"class":91},[85,671,672],{"class":450},"\u002F",[85,674,675],{"class":91}," b, ",[85,677,678],{"class":168},"nil\n",[85,680,682],{"class":87,"line":681},20,[85,683,573],{"class":91},[85,685,687],{"class":87,"line":686},21,[85,688,151],{"emptyLinePlaceholder":150},[85,690,692],{"class":87,"line":691},22,[85,693,694],{"class":98},"\u002F\u002F 结构体\n",[85,696,698,701,704,707],{"class":87,"line":697},23,[85,699,700],{"class":450},"type",[85,702,703],{"class":120}," User",[85,705,706],{"class":450}," struct",[85,708,553],{"class":91},[85,710,712,715,717],{"class":87,"line":711},24,[85,713,714],{"class":91},"    Name  ",[85,716,492],{"class":450},[85,718,719],{"class":124}," `json:\"name\"`\n",[85,721,723,726,728],{"class":87,"line":722},25,[85,724,725],{"class":91},"    Email ",[85,727,492],{"class":450},[85,729,730],{"class":124}," `json:\"email\"`\n",[85,732,734],{"class":87,"line":733},26,[85,735,573],{"class":91},[85,737,739],{"class":87,"line":738},27,[85,740,151],{"emptyLinePlaceholder":150},[85,742,744,746,749,752,755,757,760,763,765],{"class":87,"line":743},28,[85,745,526],{"class":450},[85,747,748],{"class":91}," (",[85,750,751],{"class":535},"u ",[85,753,754],{"class":120},"User",[85,756,547],{"class":91},[85,758,759],{"class":120},"String",[85,761,762],{"class":91},"() ",[85,764,492],{"class":450},[85,766,553],{"class":91},[85,768,770,772,775,778,780,783,786,789,791,794],{"class":87,"line":769},29,[85,771,558],{"class":450},[85,773,774],{"class":91}," fmt.",[85,776,777],{"class":120},"Sprintf",[85,779,532],{"class":91},[85,781,782],{"class":124},"\"",[85,784,785],{"class":168},"%s",[85,787,788],{"class":124}," \u003C",[85,790,785],{"class":168},[85,792,793],{"class":124},">\"",[85,795,796],{"class":91},", u.Name, u.Email)\n",[85,798,800],{"class":87,"line":799},30,[85,801,573],{"class":91},[85,803,805],{"class":87,"line":804},31,[85,806,151],{"emptyLinePlaceholder":150},[85,808,810],{"class":87,"line":809},32,[85,811,812],{"class":98},"\u002F\u002F 接口\n",[85,814,816,818,821,824],{"class":87,"line":815},33,[85,817,700],{"class":450},[85,819,820],{"class":120}," Reader",[85,822,823],{"class":450}," interface",[85,825,553],{"class":91},[85,827,829,832,834,836,839,842,844,847,849,851,854,857],{"class":87,"line":828},34,[85,830,831],{"class":120},"    Read",[85,833,532],{"class":91},[85,835,22],{"class":535},[85,837,838],{"class":91}," []",[85,840,841],{"class":450},"byte",[85,843,606],{"class":91},[85,845,846],{"class":535},"n",[85,848,544],{"class":450},[85,850,538],{"class":91},[85,852,853],{"class":535},"err",[85,855,856],{"class":450}," error",[85,858,656],{"class":91},[85,860,862],{"class":87,"line":861},35,[85,863,573],{"class":91},[22,865,866],{},"上面这段代码是语法速查，不代表真实项目会把变量定义、类型声明和函数都平铺在一个文件里。实际工程里更重要的是：错误处理要显式、包边界要清楚、命名要直接。",[36,868,869],{"id":869},"并发",[76,871,873],{"className":442,"code":872,"language":121,"meta":81,"style":81},"\u002F\u002F Goroutine\ngo func() {\n    fmt.Println(\"running in goroutine\")\n}()\n\n\u002F\u002F Channel\nch := make(chan string)\ngo func() { ch \u003C- \"hello\" }()\nmsg := \u003C-ch\n\n\u002F\u002F 带缓冲\nch := make(chan int, 10)\n\n\u002F\u002F Select\nselect {\ncase msg := \u003C-ch1:\n    fmt.Println(msg)\ncase msg := \u003C-ch2:\n    fmt.Println(msg)\ncase \u003C-time.After(time.Second):\n    fmt.Println(\"timeout\")\n}\n\n\u002F\u002F WaitGroup\nvar wg sync.WaitGroup\nfor i := 0; i \u003C 5; i++ {\n    wg.Add(1)\n    go func(id int) {\n        defer wg.Done()\n        fmt.Println(id)\n    }(i)\n}\nwg.Wait()\n",[50,874,875,880,890,905,910,914,919,939,957,970,974,979,1000,1004,1009,1016,1031,1040,1053,1061,1076,1089,1093,1097,1102,1118,1147,1162,1178,1192,1202,1207,1211],{"__ignoreMap":81},[85,876,877],{"class":87,"line":88},[85,878,879],{"class":98},"\u002F\u002F Goroutine\n",[85,881,882,884,887],{"class":87,"line":95},[85,883,121],{"class":450},[85,885,886],{"class":450}," func",[85,888,889],{"class":91},"() {\n",[85,891,892,895,898,900,903],{"class":87,"line":102},[85,893,894],{"class":91},"    fmt.",[85,896,897],{"class":120},"Println",[85,899,532],{"class":91},[85,901,902],{"class":124},"\"running in goroutine\"",[85,904,656],{"class":91},[85,906,907],{"class":87,"line":154},[85,908,909],{"class":91},"}()\n",[85,911,912],{"class":87,"line":160},[85,913,151],{"emptyLinePlaceholder":150},[85,915,916],{"class":87,"line":175},[85,917,918],{"class":98},"\u002F\u002F Channel\n",[85,920,921,924,926,929,931,934,937],{"class":87,"line":180},[85,922,923],{"class":91},"ch ",[85,925,506],{"class":450},[85,927,928],{"class":120}," make",[85,930,532],{"class":91},[85,932,933],{"class":450},"chan",[85,935,936],{"class":450}," string",[85,938,656],{"class":91},[85,940,941,943,945,948,951,954],{"class":87,"line":186},[85,942,121],{"class":450},[85,944,886],{"class":450},[85,946,947],{"class":91},"() { ch ",[85,949,950],{"class":450},"\u003C-",[85,952,953],{"class":124}," \"hello\"",[85,955,956],{"class":91}," }()\n",[85,958,959,962,964,967],{"class":87,"line":261},[85,960,961],{"class":91},"msg ",[85,963,506],{"class":450},[85,965,966],{"class":450}," \u003C-",[85,968,969],{"class":91},"ch\n",[85,971,972],{"class":87,"line":266},[85,973,151],{"emptyLinePlaceholder":150},[85,975,976],{"class":87,"line":272},[85,977,978],{"class":98},"\u002F\u002F 带缓冲\n",[85,980,981,983,985,987,989,991,993,995,998],{"class":87,"line":570},[85,982,923],{"class":91},[85,984,506],{"class":450},[85,986,928],{"class":120},[85,988,532],{"class":91},[85,990,933],{"class":450},[85,992,544],{"class":450},[85,994,538],{"class":91},[85,996,997],{"class":168},"10",[85,999,656],{"class":91},[85,1001,1002],{"class":87,"line":576},[85,1003,151],{"emptyLinePlaceholder":150},[85,1005,1006],{"class":87,"line":581},[85,1007,1008],{"class":98},"\u002F\u002F Select\n",[85,1010,1011,1014],{"class":87,"line":587},[85,1012,1013],{"class":450},"select",[85,1015,553],{"class":91},[85,1017,1018,1021,1024,1026,1028],{"class":87,"line":620},[85,1019,1020],{"class":450},"case",[85,1022,1023],{"class":91}," msg ",[85,1025,506],{"class":450},[85,1027,966],{"class":450},[85,1029,1030],{"class":91},"ch1:\n",[85,1032,1033,1035,1037],{"class":87,"line":637},[85,1034,894],{"class":91},[85,1036,897],{"class":120},[85,1038,1039],{"class":91},"(msg)\n",[85,1041,1042,1044,1046,1048,1050],{"class":87,"line":659},[85,1043,1020],{"class":450},[85,1045,1023],{"class":91},[85,1047,506],{"class":450},[85,1049,966],{"class":450},[85,1051,1052],{"class":91},"ch2:\n",[85,1054,1055,1057,1059],{"class":87,"line":665},[85,1056,894],{"class":91},[85,1058,897],{"class":120},[85,1060,1039],{"class":91},[85,1062,1063,1065,1067,1070,1073],{"class":87,"line":681},[85,1064,1020],{"class":450},[85,1066,966],{"class":450},[85,1068,1069],{"class":91},"time.",[85,1071,1072],{"class":120},"After",[85,1074,1075],{"class":91},"(time.Second):\n",[85,1077,1078,1080,1082,1084,1087],{"class":87,"line":686},[85,1079,894],{"class":91},[85,1081,897],{"class":120},[85,1083,532],{"class":91},[85,1085,1086],{"class":124},"\"timeout\"",[85,1088,656],{"class":91},[85,1090,1091],{"class":87,"line":691},[85,1092,573],{"class":91},[85,1094,1095],{"class":87,"line":697},[85,1096,151],{"emptyLinePlaceholder":150},[85,1098,1099],{"class":87,"line":711},[85,1100,1101],{"class":98},"\u002F\u002F WaitGroup\n",[85,1103,1104,1106,1109,1112,1115],{"class":87,"line":722},[85,1105,486],{"class":450},[85,1107,1108],{"class":91}," wg ",[85,1110,1111],{"class":120},"sync",[85,1113,1114],{"class":91},".",[85,1116,1117],{"class":120},"WaitGroup\n",[85,1119,1120,1123,1126,1128,1130,1133,1136,1139,1142,1145],{"class":87,"line":733},[85,1121,1122],{"class":450},"for",[85,1124,1125],{"class":91}," i ",[85,1127,506],{"class":450},[85,1129,632],{"class":168},[85,1131,1132],{"class":91},"; i ",[85,1134,1135],{"class":450},"\u003C",[85,1137,1138],{"class":168}," 5",[85,1140,1141],{"class":91},"; i",[85,1143,1144],{"class":450},"++",[85,1146,553],{"class":91},[85,1148,1149,1152,1155,1157,1160],{"class":87,"line":738},[85,1150,1151],{"class":91},"    wg.",[85,1153,1154],{"class":120},"Add",[85,1156,532],{"class":91},[85,1158,1159],{"class":168},"1",[85,1161,656],{"class":91},[85,1163,1164,1167,1169,1171,1174,1176],{"class":87,"line":743},[85,1165,1166],{"class":450},"    go",[85,1168,886],{"class":450},[85,1170,532],{"class":91},[85,1172,1173],{"class":535},"id",[85,1175,544],{"class":450},[85,1177,617],{"class":91},[85,1179,1180,1183,1186,1189],{"class":87,"line":769},[85,1181,1182],{"class":450},"        defer",[85,1184,1185],{"class":91}," wg.",[85,1187,1188],{"class":120},"Done",[85,1190,1191],{"class":91},"()\n",[85,1193,1194,1197,1199],{"class":87,"line":799},[85,1195,1196],{"class":91},"        fmt.",[85,1198,897],{"class":120},[85,1200,1201],{"class":91},"(id)\n",[85,1203,1204],{"class":87,"line":804},[85,1205,1206],{"class":91},"    }(i)\n",[85,1208,1209],{"class":87,"line":809},[85,1210,573],{"class":91},[85,1212,1213,1216,1219],{"class":87,"line":815},[85,1214,1215],{"class":91},"wg.",[85,1217,1218],{"class":120},"Wait",[85,1220,1191],{"class":91},[36,1222,1223],{"id":1223},"常见误区",[1225,1226,1227],"h3",{"id":1227},"过早上复杂框架",[22,1229,1230],{},"Go 的标准库已经能覆盖很多 HTTP、JSON、日志、模板、测试需求。早期项目没必要一开始就堆太多框架，先把标准库用顺，后续扩展会更稳。",[1225,1232,1233],{"id":1233},"忽略错误处理",[22,1235,1236],{},"Go 的错误处理虽然啰嗦，但它能把失败路径显式暴露出来。不要为了“好看”把错误吞掉，尤其是 I\u002FO、网络、数据库和并发相关逻辑。",[1225,1238,1240],{"id":1239},"并发写得快收尾没处理","并发写得快，收尾没处理",[22,1242,1243],{},"goroutine 起起来很容易，但真正容易出 bug 的地方是：",[298,1245,1246,1249,1252],{},[46,1247,1248],{},"通道没人接收导致阻塞",[46,1250,1251],{},"忘记关闭资源",[46,1253,1254],{},"超时、取消和退出流程没设计",[22,1256,1257,1258,1261],{},"涉及网络或批处理任务时，建议尽早引入 ",[50,1259,1260],{},"context"," 作为超时和取消的统一入口。",[36,1263,1264],{"id":1264},"交叉编译",[76,1266,1268],{"className":111,"code":1267,"language":113,"meta":81,"style":81},"# Linux\nGOOS=linux GOARCH=amd64 go build -o app-linux\n\n# macOS\nGOOS=darwin GOARCH=arm64 go build -o app-mac\n\n# Windows\nGOOS=windows GOARCH=amd64 go build -o app.exe\n",[50,1269,1270,1275,1304,1308,1313,1338,1342,1347],{"__ignoreMap":81},[85,1271,1272],{"class":87,"line":88},[85,1273,1274],{"class":98},"# Linux\n",[85,1276,1277,1280,1283,1286,1289,1291,1294,1297,1299,1301],{"class":87,"line":95},[85,1278,1279],{"class":91},"GOOS",[85,1281,1282],{"class":450},"=",[85,1284,1285],{"class":124},"linux",[85,1287,1288],{"class":91}," GOARCH",[85,1290,1282],{"class":450},[85,1292,1293],{"class":124},"amd64",[85,1295,1296],{"class":120}," go",[85,1298,354],{"class":124},[85,1300,366],{"class":168},[85,1302,1303],{"class":124}," app-linux\n",[85,1305,1306],{"class":87,"line":102},[85,1307,151],{"emptyLinePlaceholder":150},[85,1309,1310],{"class":87,"line":154},[85,1311,1312],{"class":98},"# macOS\n",[85,1314,1315,1317,1319,1322,1324,1326,1329,1331,1333,1335],{"class":87,"line":160},[85,1316,1279],{"class":91},[85,1318,1282],{"class":450},[85,1320,1321],{"class":124},"darwin",[85,1323,1288],{"class":91},[85,1325,1282],{"class":450},[85,1327,1328],{"class":124},"arm64",[85,1330,1296],{"class":120},[85,1332,354],{"class":124},[85,1334,366],{"class":168},[85,1336,1337],{"class":124}," app-mac\n",[85,1339,1340],{"class":87,"line":175},[85,1341,151],{"emptyLinePlaceholder":150},[85,1343,1344],{"class":87,"line":180},[85,1345,1346],{"class":98},"# Windows\n",[85,1348,1349,1351,1353,1356,1358,1360,1362,1364,1366,1368],{"class":87,"line":186},[85,1350,1279],{"class":91},[85,1352,1282],{"class":450},[85,1354,1355],{"class":124},"windows",[85,1357,1288],{"class":91},[85,1359,1282],{"class":450},[85,1361,1293],{"class":124},[85,1363,1296],{"class":120},[85,1365,354],{"class":124},[85,1367,366],{"class":168},[85,1369,1370],{"class":124}," app.exe\n",[22,1372,1373],{},"PowerShell 中：",[76,1375,1377],{"className":78,"code":1376,"language":80,"meta":81,"style":81},"$env:GOOS=\"linux\"; $env:GOARCH=\"amd64\"; go build -o app-linux\n",[50,1378,1379],{"__ignoreMap":81},[85,1380,1381,1384,1387,1389,1391,1394,1397,1399,1402,1404,1407,1410,1413,1416,1418],{"class":87,"line":88},[85,1382,1383],{"class":91},"$",[85,1385,1386],{"class":168},"env:",[85,1388,1279],{"class":91},[85,1390,1282],{"class":450},[85,1392,1393],{"class":124},"\"linux\"",[85,1395,1396],{"class":91},"; $",[85,1398,1386],{"class":168},[85,1400,1401],{"class":91},"GOARCH",[85,1403,1282],{"class":450},[85,1405,1406],{"class":124},"\"amd64\"",[85,1408,1409],{"class":91},"; go build ",[85,1411,1412],{"class":450},"-",[85,1414,1415],{"class":91},"o app",[85,1417,1412],{"class":450},[85,1419,1420],{"class":91},"linux\n",[36,1422,1423],{"id":1423},"常用库",[1425,1426,1427,1440],"table",{},[1428,1429,1430],"thead",{},[1431,1432,1433,1437],"tr",{},[1434,1435,1436],"th",{},"库",[1434,1438,1439],{},"说明",[1441,1442,1443,1456,1468,1480,1492],"tbody",{},[1431,1444,1445,1453],{},[1446,1447,1448],"td",{},[25,1449,1452],{"href":1450,"rel":1451},"https:\u002F\u002Fgithub.com\u002Fgin-gonic\u002Fgin",[29],"Gin",[1446,1454,1455],{},"HTTP Web 框架",[1431,1457,1458,1465],{},[1446,1459,1460],{},[25,1461,1464],{"href":1462,"rel":1463},"https:\u002F\u002Fgorm.io\u002F",[29],"GORM",[1446,1466,1467],{},"ORM",[1431,1469,1470,1477],{},[1446,1471,1472],{},[25,1473,1476],{"href":1474,"rel":1475},"https:\u002F\u002Fgithub.com\u002Fspf13\u002Fcobra",[29],"Cobra",[1446,1478,1479],{},"CLI 框架",[1431,1481,1482,1489],{},[1446,1483,1484],{},[25,1485,1488],{"href":1486,"rel":1487},"https:\u002F\u002Fgithub.com\u002Fspf13\u002Fviper",[29],"Viper",[1446,1490,1491],{},"配置管理",[1431,1493,1494,1501],{},[1446,1495,1496],{},[25,1497,1500],{"href":1498,"rel":1499},"https:\u002F\u002Fgithub.com\u002Fuber-go\u002Fzap",[29],"Zap",[1446,1502,1503],{},"高性能日志",[36,1505,1506],{"id":1506},"构建与发布建议",[298,1508,1509,1516,1526,1535],{},[46,1510,1511,1512,1515],{},"本地开发先用 ",[50,1513,1514],{},"go test .\u002F..."," 保证基本质量",[46,1517,1518,1519,1522,1523],{},"提交前跑 ",[50,1520,1521],{},"go fmt .\u002F..."," 与 ",[50,1524,1525],{},"go vet .\u002F...",[46,1527,1528,1529,1531,1532,1534],{},"需要跨平台时，再使用 ",[50,1530,1279],{}," \u002F ",[50,1533,1401],{}," 交叉编译",[46,1536,1537],{},"如果项目要容器化，可以直接把二进制打进一个很小的运行镜像里",[22,1539,1540],{},"Go 很适合做 CLI、API 服务、任务处理器和轻量守护进程；它的优势通常体现在“部署简单”和“单文件二进制”。",[36,1542,1543],{"id":1543},"延伸阅读",[298,1545,1546,1552,1558],{},[46,1547,1548],{},[25,1549,1551],{"href":1550},"\u002Fdocs\u002Fvscode-setup","VS Code 配置指南",[46,1553,1554],{},[25,1555,1557],{"href":1556},"\u002Fdocs\u002Fdocker-setup","Docker Desktop 安装与使用",[46,1559,1560],{},[25,1561,1563],{"href":1562},"\u002Fdocs\u002Fgithub-actions","GitHub Actions 入门",[36,1565,1567],{"id":1566},"vs-code-配置","VS Code 配置",[22,1569,1570,1571,1576],{},"安装 ",[25,1572,1575],{"href":1573,"rel":1574},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=golang.Go",[29],"Go 扩展","，会自动安装 gopls 等工具。",[36,1578,1579],{"id":1579},"参考链接",[298,1581,1582,1589,1597,1605],{},[46,1583,1584,1588],{},[25,1585,1587],{"href":27,"rel":1586},[29],"Go 官网"," — 文档与 Playground",[46,1590,1591,1596],{},[25,1592,1595],{"href":1593,"rel":1594},"https:\u002F\u002Fgobyexample.com\u002F",[29],"Go by Example"," — 示例教程",[46,1598,1599,1604],{},[25,1600,1603],{"href":1601,"rel":1602},"https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go",[29],"Effective Go"," — 官方最佳实践",[46,1606,1607,1612],{},[25,1608,1611],{"href":1609,"rel":1610},"https:\u002F\u002Fpkg.go.dev\u002F",[29],"Go Packages"," — 包文档",[1614,1615,1616],"style",{},"html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}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 .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}",{"title":81,"searchDepth":95,"depth":95,"links":1618},[1619,1620,1621,1622,1623,1624,1625,1626,1627,1632,1633,1634,1635,1636,1637],{"id":38,"depth":95,"text":38},{"id":74,"depth":95,"text":74},{"id":128,"depth":95,"text":128},{"id":198,"depth":95,"text":198},{"id":282,"depth":95,"text":282},{"id":329,"depth":95,"text":329},{"id":439,"depth":95,"text":439},{"id":869,"depth":95,"text":869},{"id":1223,"depth":95,"text":1223,"children":1628},[1629,1630,1631],{"id":1227,"depth":102,"text":1227},{"id":1233,"depth":102,"text":1233},{"id":1239,"depth":102,"text":1240},{"id":1264,"depth":95,"text":1264},{"id":1423,"depth":95,"text":1423},{"id":1506,"depth":95,"text":1506},{"id":1543,"depth":95,"text":1543},{"id":1566,"depth":95,"text":1567},{"id":1579,"depth":95,"text":1579},{"path":1562,"title":1563,"description":1639,"docType":8,"resourceKind":9,"categoryId":1640,"categoryLabel":1641,"updatedAt":12,"publishedAt":12,"icon":1642},"CI\u002FCD 工作流配置、自动测试、自动部署与常用 Action 推荐","infra-deployment","服务器与部署","i-carbon-cloud",{"path":1644,"title":1645,"description":1646,"docType":8,"resourceKind":9,"categoryId":1640,"categoryLabel":1641,"updatedAt":12,"publishedAt":12,"icon":1642},"\u002Fdocs\u002Flinux-commands","Linux 常用命令速查","文件操作、文本处理、进程管理、磁盘网络与系统信息常用命令",[1648,1649,1650],"希望把零散经验整理成长期可复用工作流的人","想先建立认知，再决定是否深入实践的人","希望阅读时顺手建立自己的操作清单或收藏体系的人",[1652,1653,1654],"先浏览标题、摘要和目录，带着问题阅读会更高效","顺手记录真正对你有用的命令、链接和注意事项，避免重复搜索","如果页面里提到相关文档，尽量一起打开对照，效果通常更完整",[1656,1661,1665,1669],{"path":1657,"title":1658,"description":1659,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1660,"publishedAt":1660,"icon":13},"\u002Fdocs\u002Ftesting-guide","前端测试指南","Vitest 单元测试、Playwright E2E 测试、测试策略与最佳实践","2026-02-28",{"path":1662,"title":1663,"description":1664,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1660,"publishedAt":1660,"icon":13},"\u002Fdocs\u002Fbun-deno","Bun 与 Deno 运行时","Bun 和 Deno 的安装使用、与 Node.js 对比、包管理与实用命令",{"path":1666,"title":1667,"description":1668,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1660,"publishedAt":1660,"icon":13},"\u002Fdocs\u002Fcss-tricks","CSS 实用技巧","现代 CSS 特性、布局技巧、动画、暗色模式与常用代码片段",{"path":1670,"title":1671,"description":1672,"docType":8,"resourceKind":9,"categoryId":10,"categoryLabel":11,"updatedAt":1660,"publishedAt":1660,"icon":13},"\u002Fdocs\u002Fredis-guide","Redis 使用指南","Redis 安装、数据类型、常用命令、缓存策略与 Node.js 集成",1776215712995]