[{"data":1,"prerenderedAt":4559},["ShallowReactive",2],{"content:\u002F2025\u002F07\u002Fgo-wire":3,"surround:\u002F2025\u002F07\u002Fgo-wire":4549},{"id":4,"title":5,"body":6,"categories":4527,"date":4529,"description":4530,"draft":4531,"extension":4532,"image":4533,"meta":4534,"navigation":263,"path":4536,"permalink":4533,"published":4533,"readingTime":4537,"recommend":4533,"references":4533,"seo":4542,"sitemap":4543,"stem":4544,"tags":4545,"type":4546,"updated":4547,"__hash__":4548},"content\u002Fposts\u002F2025\u002F07\u002Fgo-wire.md","Go Wire 依赖注入实践",{"type":7,"value":8,"toc":4491},"minimark",[9,13,20,28,148,155,158,173,177,195,198,213,216,233,236,242,246,361,365,814,818,1100,1104,1662,1666,1672,1711,1715,1720,1724,1733,1843,1847,1858,1863,1872,1877,2139,2146,2149,2158,2191,2222,2226,2464,2468,2485,2491,2679,2685,2753,2763,2767,2789,2793,2798,2813,2820,2824,2827,2833,2843,2856,2860,3010,3015,3019,3024,3658,3663,3832,3837,3841,3983,3991,3995,4000,4130,4142,4146,4154,4157,4380,4384,4447,4454,4457,4462,4465,4470,4473,4487],[10,11,12],"h2",{"id":12},"前言",[14,15,16],"blockquote",{},[17,18,19],"p",{},"你是否遇到这种情况，为 go 项目当中定义了太多的全局变量以及紊乱的依赖关系而苦恼。",[17,21,22,23,27],{},"就拿一个",[24,25,26],"code",{"code":26},"user","模块举例",[29,30,35],"pre",{"className":31,"code":32,"language":33,"meta":34,"style":34},"language-go shiki shiki-themes github-light github-dark","db := config.NewGormDB()\nuserDao := dao.NewUserDao(db)\nuserRepo := repo.NewUserRepo(userDao)\nuserService := service.NewUserService(userRepo)\nuserHandler := api.NewUserHandler(userService)\n","go","",[24,36,37,64,85,106,127],{"__ignoreMap":34},[38,39,42,46,50,53,57,61],"span",{"class":40,"data-line":41,"line":41},"line",1,[38,43,45],{"class":44},"sVt8B","db ",[38,47,49],{"class":48},"szBVR",":=",[38,51,52],{"class":44}," config.",[38,54,56],{"class":55},"sScJk","NewGormDB",[38,58,60],{"class":59},"sSDpw","(",[38,62,63],{"class":59},")\n",[38,65,67,70,72,75,78,80,83],{"class":40,"data-line":66,"line":66},2,[38,68,69],{"class":44},"userDao ",[38,71,49],{"class":48},[38,73,74],{"class":44}," dao.",[38,76,77],{"class":55},"NewUserDao",[38,79,60],{"class":59},[38,81,82],{"class":44},"db",[38,84,63],{"class":59},[38,86,88,91,93,96,99,101,104],{"class":40,"data-line":87,"line":87},3,[38,89,90],{"class":44},"userRepo ",[38,92,49],{"class":48},[38,94,95],{"class":44}," repo.",[38,97,98],{"class":55},"NewUserRepo",[38,100,60],{"class":59},[38,102,103],{"class":44},"userDao",[38,105,63],{"class":59},[38,107,109,112,114,117,120,122,125],{"class":40,"data-line":108,"line":108},4,[38,110,111],{"class":44},"userService ",[38,113,49],{"class":48},[38,115,116],{"class":44}," service.",[38,118,119],{"class":55},"NewUserService",[38,121,60],{"class":59},[38,123,124],{"class":44},"userRepo",[38,126,63],{"class":59},[38,128,130,133,135,138,141,143,146],{"class":40,"data-line":129,"line":129},5,[38,131,132],{"class":44},"userHandler ",[38,134,49],{"class":48},[38,136,137],{"class":44}," api.",[38,139,140],{"class":55},"NewUserHandler",[38,142,60],{"class":59},[38,144,145],{"class":44},"userService",[38,147,63],{"class":59},[17,149,150,151,154],{},"为了管理这些模块，需要自己手动分包，以及管理子模块中",[24,152,153],{"code":153},"Router","的引入，然后再统一从子模块引入初始化，有时候处理不当就会导致空指针异常，因为没有正确的处理好依赖关系",[10,156,157],{"id":157},"快速开始",[17,159,160,167,168,172],{},[161,162,166],"a",{"href":163,"rel":164},"https:\u002F\u002Fgithub.com\u002Fgoogle\u002Fwire",[165],"nofollow","wire","库恰好可以帮助解决这个问题，",[169,170,171],"strong",{},"谷歌出品，必定难用，对初学者非常的不友好","。",[174,175,176],"h3",{"id":176},"安装",[29,178,182],{"className":179,"code":180,"language":181,"meta":34,"style":34},"language-bash shiki shiki-themes github-light github-dark","go install github.com\u002Fgoogle\u002Fwire\u002Fcmd\u002Fwire@latest\n","bash",[24,183,184],{"__ignoreMap":34},[38,185,186,188,192],{"class":40,"data-line":41,"line":41},[38,187,33],{"class":55},[38,189,191],{"class":190},"sZZnC"," install",[38,193,194],{"class":190}," github.com\u002Fgoogle\u002Fwire\u002Fcmd\u002Fwire@latest\n",[174,196,197],{"id":197},"项目引入",[29,199,201],{"className":179,"code":200,"language":181,"meta":34,"style":34},"go get github.com\u002Fgoogle\u002Fwire\u002Fcmd\u002Fwire\n",[24,202,203],{"__ignoreMap":34},[38,204,205,207,210],{"class":40,"data-line":41,"line":41},[38,206,33],{"class":55},[38,208,209],{"class":190}," get",[38,211,212],{"class":190}," github.com\u002Fgoogle\u002Fwire\u002Fcmd\u002Fwire\n",[174,214,215],{"id":215},"测试",[29,217,219],{"className":179,"code":218,"language":181,"meta":34,"style":34},"wire -h # 查看是否安装成功\n",[24,220,221],{"__ignoreMap":34},[38,222,223,225,229],{"class":40,"data-line":41,"line":41},[38,224,166],{"class":55},[38,226,228],{"class":227},"sj4cs"," -h",[38,230,232],{"class":231},"sJ8bj"," # 查看是否安装成功\n",[10,234,235],{"id":235},"项目初始化",[17,237,238,239,241],{},"我们举个简单的案例，假设我们现在已经写好",[24,240,26],{"code":26},"模块",[174,243,245],{"id":244},"domian-层","domian 层",[29,247,249],{"className":31,"code":248,"language":33,"meta":34,"style":34},"package domain\n\nimport \"gorm.io\u002Fgorm\"\n\ntype User struct {\n\tgorm.Model `gorm:\"embedded\"`\n\tName       string `gorm:\"unique\"`\n\tAge        int\n\tGender     string\n}\n",[24,250,251,259,265,279,283,300,319,333,344,355],{"__ignoreMap":34},[38,252,253,256],{"class":40,"data-line":41,"line":41},[38,254,255],{"class":48},"package",[38,257,258],{"class":55}," domain\n",[38,260,261],{"class":40,"data-line":66,"line":66},[38,262,264],{"emptyLinePlaceholder":263},true,"\n",[38,266,267,270,273,276],{"class":40,"data-line":87,"line":87},[38,268,269],{"class":48},"import",[38,271,272],{"class":190}," \"",[38,274,275],{"class":55},"gorm.io\u002Fgorm",[38,277,278],{"class":190},"\"\n",[38,280,281],{"class":40,"data-line":108,"line":108},[38,282,264],{"emptyLinePlaceholder":263},[38,284,285,288,291,294,297],{"class":40,"data-line":129,"line":129},[38,286,287],{"class":48},"type",[38,289,290],{"class":55}," User",[38,292,293],{"class":48}," struct",[38,295,296],{"class":44}," ",[38,298,299],{"class":59},"{\n",[38,301,303,307,310,313,316],{"class":40,"data-line":302,"line":302},6,[38,304,306],{"class":305},"indent","\t",[38,308,309],{"class":55},"gorm",[38,311,312],{"class":44},".",[38,314,315],{"class":55},"Model",[38,317,318],{"class":190}," `gorm:\"embedded\"`\n",[38,320,322,324,327,330],{"class":40,"data-line":321,"line":321},7,[38,323,306],{"class":305},[38,325,326],{"class":44},"Name       ",[38,328,329],{"class":48},"string",[38,331,332],{"class":190}," `gorm:\"unique\"`\n",[38,334,336,338,341],{"class":40,"data-line":335,"line":335},8,[38,337,306],{"class":305},[38,339,340],{"class":44},"Age        ",[38,342,343],{"class":48},"int\n",[38,345,347,349,352],{"class":40,"data-line":346,"line":346},9,[38,348,306],{"class":305},[38,350,351],{"class":44},"Gender     ",[38,353,354],{"class":48},"string\n",[38,356,358],{"class":40,"data-line":357,"line":357},10,[38,359,360],{"class":59},"}\n",[174,362,364],{"id":363},"dao-层","dao 层",[29,366,368],{"className":31,"code":367,"language":33,"meta":34,"style":34},"package dao\n\nimport (\n\t\"gorm.io\u002Fgorm\"\n\t\"wire_learn\u002Finternal\u002Fuser\u002Fdomain\"\n)\n\ntype UserDao struct {\n\tdb *gorm.DB\n}\n\nfunc NewUserDao(db *gorm.DB) *UserDao {\n\treturn &UserDao{db}\n}\n\ntype IUserDao interface {\n\tCreate(user domain.User) error\n\tFindIsExistByName(name string) bool\n}\n\nvar _ IUserDao = (*UserDao)(nil)\n\nfunc (r *UserDao) Create(user domain.User) error {\n\treturn r.db.Create(&user).Error\n}\n\nfunc (r *UserDao) FindIsExistByName(name string) bool {\n\treturn r.db.Where(\"name=?\", name).First(&domain.User{}).RowsAffected != 0\n}\n",[24,369,370,377,381,390,401,412,416,420,433,449,453,458,496,517,522,527,542,569,592,597,602,634,639,682,706,711,716,754,809],{"__ignoreMap":34},[38,371,372,374],{"class":40,"data-line":41,"line":41},[38,373,255],{"class":48},[38,375,376],{"class":55}," dao\n",[38,378,379],{"class":40,"data-line":66,"line":66},[38,380,264],{"emptyLinePlaceholder":263},[38,382,383,385,387],{"class":40,"data-line":87,"line":87},[38,384,269],{"class":48},[38,386,296],{"class":44},[38,388,389],{"class":59},"(\n",[38,391,392,394,397,399],{"class":40,"data-line":108,"line":108},[38,393,306],{"class":305},[38,395,396],{"class":190},"\"",[38,398,275],{"class":55},[38,400,278],{"class":190},[38,402,403,405,407,410],{"class":40,"data-line":129,"line":129},[38,404,306],{"class":305},[38,406,396],{"class":190},[38,408,409],{"class":55},"wire_learn\u002Finternal\u002Fuser\u002Fdomain",[38,411,278],{"class":190},[38,413,414],{"class":40,"data-line":302,"line":302},[38,415,63],{"class":59},[38,417,418],{"class":40,"data-line":321,"line":321},[38,419,264],{"emptyLinePlaceholder":263},[38,421,422,424,427,429,431],{"class":40,"data-line":335,"line":335},[38,423,287],{"class":48},[38,425,426],{"class":55}," UserDao",[38,428,293],{"class":48},[38,430,296],{"class":44},[38,432,299],{"class":59},[38,434,435,437,439,442,444,446],{"class":40,"data-line":346,"line":346},[38,436,306],{"class":305},[38,438,45],{"class":44},[38,440,441],{"class":48},"*",[38,443,309],{"class":55},[38,445,312],{"class":44},[38,447,448],{"class":55},"DB\n",[38,450,451],{"class":40,"data-line":357,"line":357},[38,452,360],{"class":59},[38,454,456],{"class":40,"data-line":455,"line":455},11,[38,457,264],{"emptyLinePlaceholder":263},[38,459,461,464,467,469,472,475,477,479,482,485,487,489,492,494],{"class":40,"data-line":460,"line":460},12,[38,462,463],{"class":48},"func",[38,465,466],{"class":55}," NewUserDao",[38,468,60],{"class":59},[38,470,82],{"class":471},"s4XuR",[38,473,474],{"class":48}," *",[38,476,309],{"class":55},[38,478,312],{"class":44},[38,480,481],{"class":55},"DB",[38,483,484],{"class":59},")",[38,486,296],{"class":44},[38,488,441],{"class":48},[38,490,491],{"class":55},"UserDao",[38,493,296],{"class":44},[38,495,299],{"class":59},[38,497,499,501,504,507,509,513,515],{"class":40,"data-line":498,"line":498},13,[38,500,306],{"class":305},[38,502,503],{"class":48},"return",[38,505,506],{"class":48}," &",[38,508,491],{"class":55},[38,510,512],{"class":511},"sJX2D","{",[38,514,82],{"class":44},[38,516,360],{"class":511},[38,518,520],{"class":40,"data-line":519,"line":519},14,[38,521,360],{"class":59},[38,523,525],{"class":40,"data-line":524,"line":524},15,[38,526,264],{"emptyLinePlaceholder":263},[38,528,530,532,535,538,540],{"class":40,"data-line":529,"line":529},16,[38,531,287],{"class":48},[38,533,534],{"class":55}," IUserDao",[38,536,537],{"class":48}," interface",[38,539,296],{"class":44},[38,541,299],{"class":59},[38,543,545,547,550,552,554,557,559,562,564,566],{"class":40,"data-line":544,"line":544},17,[38,546,306],{"class":305},[38,548,549],{"class":55},"Create",[38,551,60],{"class":511},[38,553,26],{"class":471},[38,555,556],{"class":55}," domain",[38,558,312],{"class":44},[38,560,561],{"class":55},"User",[38,563,484],{"class":511},[38,565,296],{"class":44},[38,567,568],{"class":48},"error\n",[38,570,572,574,577,579,582,585,587,589],{"class":40,"data-line":571,"line":571},18,[38,573,306],{"class":305},[38,575,576],{"class":55},"FindIsExistByName",[38,578,60],{"class":511},[38,580,581],{"class":471},"name",[38,583,584],{"class":48}," string",[38,586,484],{"class":511},[38,588,296],{"class":44},[38,590,591],{"class":48},"bool\n",[38,593,595],{"class":40,"data-line":594,"line":594},19,[38,596,360],{"class":59},[38,598,600],{"class":40,"data-line":599,"line":599},20,[38,601,264],{"emptyLinePlaceholder":263},[38,603,605,608,611,614,617,619,621,623,625,627,629,632],{"class":40,"data-line":604,"line":604},21,[38,606,607],{"class":48},"var",[38,609,610],{"class":44}," _ ",[38,612,613],{"class":55},"IUserDao",[38,615,616],{"class":48}," =",[38,618,296],{"class":44},[38,620,60],{"class":59},[38,622,441],{"class":48},[38,624,491],{"class":55},[38,626,484],{"class":59},[38,628,60],{"class":59},[38,630,631],{"class":227},"nil",[38,633,63],{"class":59},[38,635,637],{"class":40,"data-line":636,"line":636},22,[38,638,264],{"emptyLinePlaceholder":263},[38,640,642,644,646,648,651,653,655,657,659,661,663,665,667,669,671,673,675,678,680],{"class":40,"data-line":641,"line":641},23,[38,643,463],{"class":48},[38,645,296],{"class":44},[38,647,60],{"class":59},[38,649,650],{"class":471},"r ",[38,652,441],{"class":48},[38,654,491],{"class":55},[38,656,484],{"class":59},[38,658,296],{"class":44},[38,660,549],{"class":55},[38,662,60],{"class":59},[38,664,26],{"class":471},[38,666,556],{"class":55},[38,668,312],{"class":44},[38,670,561],{"class":55},[38,672,484],{"class":59},[38,674,296],{"class":44},[38,676,677],{"class":48},"error",[38,679,296],{"class":44},[38,681,299],{"class":59},[38,683,685,687,689,692,694,696,699,701,703],{"class":40,"data-line":684,"line":684},24,[38,686,306],{"class":305},[38,688,503],{"class":48},[38,690,691],{"class":44}," r.db.",[38,693,549],{"class":55},[38,695,60],{"class":511},[38,697,698],{"class":48},"&",[38,700,26],{"class":44},[38,702,484],{"class":511},[38,704,705],{"class":44},".Error\n",[38,707,709],{"class":40,"data-line":708,"line":708},25,[38,710,360],{"class":59},[38,712,714],{"class":40,"data-line":713,"line":713},26,[38,715,264],{"emptyLinePlaceholder":263},[38,717,719,721,723,725,727,729,731,733,735,737,739,741,743,745,747,750,752],{"class":40,"data-line":718,"line":718},27,[38,720,463],{"class":48},[38,722,296],{"class":44},[38,724,60],{"class":59},[38,726,650],{"class":471},[38,728,441],{"class":48},[38,730,491],{"class":55},[38,732,484],{"class":59},[38,734,296],{"class":44},[38,736,576],{"class":55},[38,738,60],{"class":59},[38,740,581],{"class":471},[38,742,584],{"class":48},[38,744,484],{"class":59},[38,746,296],{"class":44},[38,748,749],{"class":48},"bool",[38,751,296],{"class":44},[38,753,299],{"class":59},[38,755,757,759,761,763,766,768,771,774,776,778,781,783,785,788,790,792,795,798,800,803,806],{"class":40,"data-line":756,"line":756},28,[38,758,306],{"class":305},[38,760,503],{"class":48},[38,762,691],{"class":44},[38,764,765],{"class":55},"Where",[38,767,60],{"class":511},[38,769,770],{"class":190},"\"name=?\"",[38,772,773],{"class":44},", name",[38,775,484],{"class":511},[38,777,312],{"class":44},[38,779,780],{"class":55},"First",[38,782,60],{"class":511},[38,784,698],{"class":48},[38,786,787],{"class":55},"domain",[38,789,312],{"class":44},[38,791,561],{"class":55},[38,793,512],{"class":794},"sqkie",[38,796,797],{"class":794},"}",[38,799,484],{"class":511},[38,801,802],{"class":44},".RowsAffected ",[38,804,805],{"class":48},"!=",[38,807,808],{"class":227}," 0\n",[38,810,812],{"class":40,"data-line":811,"line":811},29,[38,813,360],{"class":59},[174,815,817],{"id":816},"service-层","service 层",[29,819,821],{"className":31,"code":820,"language":33,"meta":34,"style":34},"package service\n\nimport (\n\t\"wire_learn\u002Finternal\u002Fuser\u002Fdomain\"\n\t\"wire_learn\u002Finternal\u002Fuser\u002Frepo\"\n)\n\ntype UserService struct {\n\trepo repo.IUserRepo\n}\n\ntype IUserService interface {\n\tCreateUser(user domain.User) error\n}\n\nvar _ IUserService = (*UserService)(nil)\n\nfunc NewUserService(repo repo.IUserRepo) *UserService {\n\treturn &UserService{repo}\n}\n\nfunc (s *UserService) CreateUser(user domain.User) error {\n\treturn s.repo.Create(user)\n}\n",[24,822,823,830,834,842,852,863,867,871,884,899,903,907,920,943,947,951,979,983,1014,1030,1034,1038,1079,1096],{"__ignoreMap":34},[38,824,825,827],{"class":40,"data-line":41,"line":41},[38,826,255],{"class":48},[38,828,829],{"class":55}," service\n",[38,831,832],{"class":40,"data-line":66,"line":66},[38,833,264],{"emptyLinePlaceholder":263},[38,835,836,838,840],{"class":40,"data-line":87,"line":87},[38,837,269],{"class":48},[38,839,296],{"class":44},[38,841,389],{"class":59},[38,843,844,846,848,850],{"class":40,"data-line":108,"line":108},[38,845,306],{"class":305},[38,847,396],{"class":190},[38,849,409],{"class":55},[38,851,278],{"class":190},[38,853,854,856,858,861],{"class":40,"data-line":129,"line":129},[38,855,306],{"class":305},[38,857,396],{"class":190},[38,859,860],{"class":55},"wire_learn\u002Finternal\u002Fuser\u002Frepo",[38,862,278],{"class":190},[38,864,865],{"class":40,"data-line":302,"line":302},[38,866,63],{"class":59},[38,868,869],{"class":40,"data-line":321,"line":321},[38,870,264],{"emptyLinePlaceholder":263},[38,872,873,875,878,880,882],{"class":40,"data-line":335,"line":335},[38,874,287],{"class":48},[38,876,877],{"class":55}," UserService",[38,879,293],{"class":48},[38,881,296],{"class":44},[38,883,299],{"class":59},[38,885,886,888,891,894,896],{"class":40,"data-line":346,"line":346},[38,887,306],{"class":305},[38,889,890],{"class":44},"repo ",[38,892,893],{"class":55},"repo",[38,895,312],{"class":44},[38,897,898],{"class":55},"IUserRepo\n",[38,900,901],{"class":40,"data-line":357,"line":357},[38,902,360],{"class":59},[38,904,905],{"class":40,"data-line":455,"line":455},[38,906,264],{"emptyLinePlaceholder":263},[38,908,909,911,914,916,918],{"class":40,"data-line":460,"line":460},[38,910,287],{"class":48},[38,912,913],{"class":55}," IUserService",[38,915,537],{"class":48},[38,917,296],{"class":44},[38,919,299],{"class":59},[38,921,922,924,927,929,931,933,935,937,939,941],{"class":40,"data-line":498,"line":498},[38,923,306],{"class":305},[38,925,926],{"class":55},"CreateUser",[38,928,60],{"class":511},[38,930,26],{"class":471},[38,932,556],{"class":55},[38,934,312],{"class":44},[38,936,561],{"class":55},[38,938,484],{"class":511},[38,940,296],{"class":44},[38,942,568],{"class":48},[38,944,945],{"class":40,"data-line":519,"line":519},[38,946,360],{"class":59},[38,948,949],{"class":40,"data-line":524,"line":524},[38,950,264],{"emptyLinePlaceholder":263},[38,952,953,955,957,960,962,964,966,968,971,973,975,977],{"class":40,"data-line":529,"line":529},[38,954,607],{"class":48},[38,956,610],{"class":44},[38,958,959],{"class":55},"IUserService",[38,961,616],{"class":48},[38,963,296],{"class":44},[38,965,60],{"class":59},[38,967,441],{"class":48},[38,969,970],{"class":55},"UserService",[38,972,484],{"class":59},[38,974,60],{"class":59},[38,976,631],{"class":227},[38,978,63],{"class":59},[38,980,981],{"class":40,"data-line":544,"line":544},[38,982,264],{"emptyLinePlaceholder":263},[38,984,985,987,990,992,994,997,999,1002,1004,1006,1008,1010,1012],{"class":40,"data-line":571,"line":571},[38,986,463],{"class":48},[38,988,989],{"class":55}," NewUserService",[38,991,60],{"class":59},[38,993,893],{"class":471},[38,995,996],{"class":55}," repo",[38,998,312],{"class":44},[38,1000,1001],{"class":55},"IUserRepo",[38,1003,484],{"class":59},[38,1005,296],{"class":44},[38,1007,441],{"class":48},[38,1009,970],{"class":55},[38,1011,296],{"class":44},[38,1013,299],{"class":59},[38,1015,1016,1018,1020,1022,1024,1026,1028],{"class":40,"data-line":594,"line":594},[38,1017,306],{"class":305},[38,1019,503],{"class":48},[38,1021,506],{"class":48},[38,1023,970],{"class":55},[38,1025,512],{"class":511},[38,1027,893],{"class":44},[38,1029,360],{"class":511},[38,1031,1032],{"class":40,"data-line":599,"line":599},[38,1033,360],{"class":59},[38,1035,1036],{"class":40,"data-line":604,"line":604},[38,1037,264],{"emptyLinePlaceholder":263},[38,1039,1040,1042,1044,1046,1049,1051,1053,1055,1057,1059,1061,1063,1065,1067,1069,1071,1073,1075,1077],{"class":40,"data-line":636,"line":636},[38,1041,463],{"class":48},[38,1043,296],{"class":44},[38,1045,60],{"class":59},[38,1047,1048],{"class":471},"s ",[38,1050,441],{"class":48},[38,1052,970],{"class":55},[38,1054,484],{"class":59},[38,1056,296],{"class":44},[38,1058,926],{"class":55},[38,1060,60],{"class":59},[38,1062,26],{"class":471},[38,1064,556],{"class":55},[38,1066,312],{"class":44},[38,1068,561],{"class":55},[38,1070,484],{"class":59},[38,1072,296],{"class":44},[38,1074,677],{"class":48},[38,1076,296],{"class":44},[38,1078,299],{"class":59},[38,1080,1081,1083,1085,1088,1090,1092,1094],{"class":40,"data-line":641,"line":641},[38,1082,306],{"class":305},[38,1084,503],{"class":48},[38,1086,1087],{"class":44}," s.repo.",[38,1089,549],{"class":55},[38,1091,60],{"class":511},[38,1093,26],{"class":44},[38,1095,63],{"class":511},[38,1097,1098],{"class":40,"data-line":684,"line":684},[38,1099,360],{"class":59},[174,1101,1103],{"id":1102},"api-层","api 层",[29,1105,1107],{"className":31,"code":1106,"language":33,"meta":34,"style":34},"package api\n\nimport (\n\t\"github.com\u002Fgin-gonic\u002Fgin\"\n\t\"net\u002Fhttp\"\n\t\"wire_learn\u002Finternal\u002Fuser\u002Fdomain\"\n\t\"wire_learn\u002Finternal\u002Fuser\u002Fservice\"\n\t\"wire_learn\u002Fpkg\u002Fresp\"\n)\n\ntype UserHandler struct {\n\tserv service.IUserService\n}\n\ntype IUserHandler interface {\n\tLogin(c *gin.Context)\n}\n\nvar _ IUserHandler = (*UserHandler)(nil)\n\nfunc NewUserHandler(serv service.IUserService) *UserHandler {\n\treturn &UserHandler{\n\t\tserv: serv,\n\t}\n}\n\nfunc (h *UserHandler) Login(c *gin.Context) {\n\tvar userReq UserReq\n\tif err := c.ShouldBindJSON(&userReq); err != nil {\n\t\tresp.FailWithMsg(c, http.StatusBadRequest, \"UserReq类型不匹配\")\n\t\treturn\n\t}\n\tuser := domain.User{\n\t\tName:   userReq.Username,\n\t\tAge:    userReq.Age,\n\t\tGender: userReq.Gender,\n\t}\n\terr := h.serv.CreateUser(user)\n\tif err != nil {\n\t\tresp.FailWithMsg(c, http.StatusBadRequest, err.Error())\n\t\treturn\n\t}\n\tresp.Success(c)\n}\n",[24,1108,1109,1116,1120,1128,1139,1150,1160,1171,1182,1186,1190,1203,1218,1222,1226,1239,1263,1267,1271,1299,1303,1334,1346,1355,1363,1367,1371,1410,1422,1461,1484,1494,1503,1521,1531,1541,1551,1560,1581,1598,1623,1632,1641,1657],{"__ignoreMap":34},[38,1110,1111,1113],{"class":40,"data-line":41,"line":41},[38,1112,255],{"class":48},[38,1114,1115],{"class":55}," api\n",[38,1117,1118],{"class":40,"data-line":66,"line":66},[38,1119,264],{"emptyLinePlaceholder":263},[38,1121,1122,1124,1126],{"class":40,"data-line":87,"line":87},[38,1123,269],{"class":48},[38,1125,296],{"class":44},[38,1127,389],{"class":59},[38,1129,1130,1132,1134,1137],{"class":40,"data-line":108,"line":108},[38,1131,306],{"class":305},[38,1133,396],{"class":190},[38,1135,1136],{"class":55},"github.com\u002Fgin-gonic\u002Fgin",[38,1138,278],{"class":190},[38,1140,1141,1143,1145,1148],{"class":40,"data-line":129,"line":129},[38,1142,306],{"class":305},[38,1144,396],{"class":190},[38,1146,1147],{"class":55},"net\u002Fhttp",[38,1149,278],{"class":190},[38,1151,1152,1154,1156,1158],{"class":40,"data-line":302,"line":302},[38,1153,306],{"class":305},[38,1155,396],{"class":190},[38,1157,409],{"class":55},[38,1159,278],{"class":190},[38,1161,1162,1164,1166,1169],{"class":40,"data-line":321,"line":321},[38,1163,306],{"class":305},[38,1165,396],{"class":190},[38,1167,1168],{"class":55},"wire_learn\u002Finternal\u002Fuser\u002Fservice",[38,1170,278],{"class":190},[38,1172,1173,1175,1177,1180],{"class":40,"data-line":335,"line":335},[38,1174,306],{"class":305},[38,1176,396],{"class":190},[38,1178,1179],{"class":55},"wire_learn\u002Fpkg\u002Fresp",[38,1181,278],{"class":190},[38,1183,1184],{"class":40,"data-line":346,"line":346},[38,1185,63],{"class":59},[38,1187,1188],{"class":40,"data-line":357,"line":357},[38,1189,264],{"emptyLinePlaceholder":263},[38,1191,1192,1194,1197,1199,1201],{"class":40,"data-line":455,"line":455},[38,1193,287],{"class":48},[38,1195,1196],{"class":55}," UserHandler",[38,1198,293],{"class":48},[38,1200,296],{"class":44},[38,1202,299],{"class":59},[38,1204,1205,1207,1210,1213,1215],{"class":40,"data-line":460,"line":460},[38,1206,306],{"class":305},[38,1208,1209],{"class":44},"serv ",[38,1211,1212],{"class":55},"service",[38,1214,312],{"class":44},[38,1216,1217],{"class":55},"IUserService\n",[38,1219,1220],{"class":40,"data-line":498,"line":498},[38,1221,360],{"class":59},[38,1223,1224],{"class":40,"data-line":519,"line":519},[38,1225,264],{"emptyLinePlaceholder":263},[38,1227,1228,1230,1233,1235,1237],{"class":40,"data-line":524,"line":524},[38,1229,287],{"class":48},[38,1231,1232],{"class":55}," IUserHandler",[38,1234,537],{"class":48},[38,1236,296],{"class":44},[38,1238,299],{"class":59},[38,1240,1241,1243,1246,1248,1251,1253,1256,1258,1261],{"class":40,"data-line":529,"line":529},[38,1242,306],{"class":305},[38,1244,1245],{"class":55},"Login",[38,1247,60],{"class":511},[38,1249,1250],{"class":471},"c",[38,1252,474],{"class":48},[38,1254,1255],{"class":55},"gin",[38,1257,312],{"class":44},[38,1259,1260],{"class":55},"Context",[38,1262,63],{"class":511},[38,1264,1265],{"class":40,"data-line":544,"line":544},[38,1266,360],{"class":59},[38,1268,1269],{"class":40,"data-line":571,"line":571},[38,1270,264],{"emptyLinePlaceholder":263},[38,1272,1273,1275,1277,1280,1282,1284,1286,1288,1291,1293,1295,1297],{"class":40,"data-line":594,"line":594},[38,1274,607],{"class":48},[38,1276,610],{"class":44},[38,1278,1279],{"class":55},"IUserHandler",[38,1281,616],{"class":48},[38,1283,296],{"class":44},[38,1285,60],{"class":59},[38,1287,441],{"class":48},[38,1289,1290],{"class":55},"UserHandler",[38,1292,484],{"class":59},[38,1294,60],{"class":59},[38,1296,631],{"class":227},[38,1298,63],{"class":59},[38,1300,1301],{"class":40,"data-line":599,"line":599},[38,1302,264],{"emptyLinePlaceholder":263},[38,1304,1305,1307,1310,1312,1315,1318,1320,1322,1324,1326,1328,1330,1332],{"class":40,"data-line":604,"line":604},[38,1306,463],{"class":48},[38,1308,1309],{"class":55}," NewUserHandler",[38,1311,60],{"class":59},[38,1313,1314],{"class":471},"serv",[38,1316,1317],{"class":55}," service",[38,1319,312],{"class":44},[38,1321,959],{"class":55},[38,1323,484],{"class":59},[38,1325,296],{"class":44},[38,1327,441],{"class":48},[38,1329,1290],{"class":55},[38,1331,296],{"class":44},[38,1333,299],{"class":59},[38,1335,1336,1338,1340,1342,1344],{"class":40,"data-line":636,"line":636},[38,1337,306],{"class":305},[38,1339,503],{"class":48},[38,1341,506],{"class":48},[38,1343,1290],{"class":55},[38,1345,299],{"class":511},[38,1347,1348,1350,1352],{"class":40,"data-line":641,"line":641},[38,1349,306],{"class":305},[38,1351,306],{"class":305},[38,1353,1354],{"class":44},"serv: serv,\n",[38,1356,1357,1359,1361],{"class":40,"data-line":684,"line":684},[38,1358,306],{"class":305},[38,1360,34],{"class":44},[38,1362,360],{"class":511},[38,1364,1365],{"class":40,"data-line":708,"line":708},[38,1366,360],{"class":59},[38,1368,1369],{"class":40,"data-line":713,"line":713},[38,1370,264],{"emptyLinePlaceholder":263},[38,1372,1373,1375,1377,1379,1382,1384,1386,1388,1390,1392,1394,1396,1398,1400,1402,1404,1406,1408],{"class":40,"data-line":718,"line":718},[38,1374,463],{"class":48},[38,1376,296],{"class":44},[38,1378,60],{"class":59},[38,1380,1381],{"class":471},"h ",[38,1383,441],{"class":48},[38,1385,1290],{"class":55},[38,1387,484],{"class":59},[38,1389,296],{"class":44},[38,1391,1245],{"class":55},[38,1393,60],{"class":59},[38,1395,1250],{"class":471},[38,1397,474],{"class":48},[38,1399,1255],{"class":55},[38,1401,312],{"class":44},[38,1403,1260],{"class":55},[38,1405,484],{"class":59},[38,1407,296],{"class":44},[38,1409,299],{"class":59},[38,1411,1412,1414,1416,1419],{"class":40,"data-line":756,"line":756},[38,1413,306],{"class":305},[38,1415,607],{"class":48},[38,1417,1418],{"class":44}," userReq ",[38,1420,1421],{"class":55},"UserReq\n",[38,1423,1424,1426,1429,1432,1434,1437,1440,1442,1444,1447,1449,1452,1454,1457,1459],{"class":40,"data-line":811,"line":811},[38,1425,306],{"class":305},[38,1427,1428],{"class":48},"if",[38,1430,1431],{"class":44}," err ",[38,1433,49],{"class":48},[38,1435,1436],{"class":44}," c.",[38,1438,1439],{"class":55},"ShouldBindJSON",[38,1441,60],{"class":511},[38,1443,698],{"class":48},[38,1445,1446],{"class":44},"userReq",[38,1448,484],{"class":511},[38,1450,1451],{"class":44},"; err ",[38,1453,805],{"class":48},[38,1455,1456],{"class":227}," nil",[38,1458,296],{"class":44},[38,1460,299],{"class":511},[38,1462,1464,1466,1468,1471,1474,1476,1479,1482],{"class":40,"data-line":1463,"line":1463},30,[38,1465,306],{"class":305},[38,1467,306],{"class":305},[38,1469,1470],{"class":44},"resp.",[38,1472,1473],{"class":55},"FailWithMsg",[38,1475,60],{"class":794},[38,1477,1478],{"class":44},"c, http.StatusBadRequest, ",[38,1480,1481],{"class":190},"\"UserReq类型不匹配\"",[38,1483,63],{"class":794},[38,1485,1487,1489,1491],{"class":40,"data-line":1486,"line":1486},31,[38,1488,306],{"class":305},[38,1490,306],{"class":305},[38,1492,1493],{"class":48},"return\n",[38,1495,1497,1499,1501],{"class":40,"data-line":1496,"line":1496},32,[38,1498,306],{"class":305},[38,1500,34],{"class":44},[38,1502,360],{"class":511},[38,1504,1506,1508,1511,1513,1515,1517,1519],{"class":40,"data-line":1505,"line":1505},33,[38,1507,306],{"class":305},[38,1509,1510],{"class":44},"user ",[38,1512,49],{"class":48},[38,1514,556],{"class":55},[38,1516,312],{"class":44},[38,1518,561],{"class":55},[38,1520,299],{"class":511},[38,1522,1524,1526,1528],{"class":40,"data-line":1523,"line":1523},34,[38,1525,306],{"class":305},[38,1527,306],{"class":305},[38,1529,1530],{"class":44},"Name:   userReq.Username,\n",[38,1532,1534,1536,1538],{"class":40,"data-line":1533,"line":1533},35,[38,1535,306],{"class":305},[38,1537,306],{"class":305},[38,1539,1540],{"class":44},"Age:    userReq.Age,\n",[38,1542,1544,1546,1548],{"class":40,"data-line":1543,"line":1543},36,[38,1545,306],{"class":305},[38,1547,306],{"class":305},[38,1549,1550],{"class":44},"Gender: userReq.Gender,\n",[38,1552,1554,1556,1558],{"class":40,"data-line":1553,"line":1553},37,[38,1555,306],{"class":305},[38,1557,34],{"class":44},[38,1559,360],{"class":511},[38,1561,1563,1565,1568,1570,1573,1575,1577,1579],{"class":40,"data-line":1562,"line":1562},38,[38,1564,306],{"class":305},[38,1566,1567],{"class":44},"err ",[38,1569,49],{"class":48},[38,1571,1572],{"class":44}," h.serv.",[38,1574,926],{"class":55},[38,1576,60],{"class":511},[38,1578,26],{"class":44},[38,1580,63],{"class":511},[38,1582,1584,1586,1588,1590,1592,1594,1596],{"class":40,"data-line":1583,"line":1583},39,[38,1585,306],{"class":305},[38,1587,1428],{"class":48},[38,1589,1431],{"class":44},[38,1591,805],{"class":48},[38,1593,1456],{"class":227},[38,1595,296],{"class":44},[38,1597,299],{"class":511},[38,1599,1601,1603,1605,1607,1609,1611,1614,1617,1619,1621],{"class":40,"data-line":1600,"line":1600},40,[38,1602,306],{"class":305},[38,1604,306],{"class":305},[38,1606,1470],{"class":44},[38,1608,1473],{"class":55},[38,1610,60],{"class":794},[38,1612,1613],{"class":44},"c, http.StatusBadRequest, err.",[38,1615,1616],{"class":55},"Error",[38,1618,60],{"class":59},[38,1620,484],{"class":59},[38,1622,63],{"class":794},[38,1624,1626,1628,1630],{"class":40,"data-line":1625,"line":1625},41,[38,1627,306],{"class":305},[38,1629,306],{"class":305},[38,1631,1493],{"class":48},[38,1633,1635,1637,1639],{"class":40,"data-line":1634,"line":1634},42,[38,1636,306],{"class":305},[38,1638,34],{"class":44},[38,1640,360],{"class":511},[38,1642,1644,1646,1648,1651,1653,1655],{"class":40,"data-line":1643,"line":1643},43,[38,1645,306],{"class":305},[38,1647,1470],{"class":44},[38,1649,1650],{"class":55},"Success",[38,1652,60],{"class":511},[38,1654,1250],{"class":44},[38,1656,63],{"class":511},[38,1658,1660],{"class":40,"data-line":1659,"line":1659},44,[38,1661,360],{"class":59},[10,1663,1665],{"id":1664},"不使用-wire-怎么写","不使用 wire 怎么写",[17,1667,1668,1669,1671],{},"在没有接触",[24,1670,166],{"code":166},"之前，我是这样写的",[1673,1674,1675,1679,1693],"ul",{},[1676,1677,1678],"li",{},"初始化 gormDB，挂载到全局变量 DB 上",[1676,1680,1681,1682,1685,1686,1688,1689,1692],{},"然后新建一个",[24,1683,1684],{"code":1684},"router","文件夹，里面分包，在",[24,1687,26],{"code":26},"模块下建立一个",[24,1690,1691],{"code":1691},"initUserRouter","的函数初始化当前模块的路由（初始化 dao,repo,service,api）",[1676,1694,1695,1696,1698,1699,1702,1703,1706,1707,1710],{},"然后在",[24,1697,1684],{"code":1684},"文件夹下的",[24,1700,1701],{"code":1701},"enter.go","入口文件初始化总路由",[24,1704,1705],{"code":1705},"initAppRouter","，然后在",[24,1708,1709],{"code":1709},"main.go","中引入。",[10,1712,1714],{"id":1713},"使用-wire-又该怎么写呢","使用 wire 又该怎么写呢",[17,1716,1717],{},[169,1718,1719],{},"我会慢慢的引导大家，报错先别急",[174,1721,1723],{"id":1722},"第一步-wirebuild","第一步 wire.Build",[17,1725,1726,1727,1729,1730],{},"在",[24,1728,1709],{"code":1709},"的同级目录下新建一个",[24,1731,1732],{"code":1732},"wire.go",[29,1734,1736],{"className":31,"code":1735,"language":33,"meta":34,"style":34},"func InitUserHandler() *api.UserHandler {\n\twire.Build(\n        config.NewGormDB, # 绑定db\n\t\tapi.NewUserHandler,\n\t\tservice.NewUserService,\n\t\trepo.NewUserRepo,\n\t\tdao.NewUserDao,\n\t)\n\treturn nil\n}\n",[24,1737,1738,1764,1776,1786,1795,1804,1813,1822,1830,1839],{"__ignoreMap":34},[38,1739,1740,1742,1745,1747,1749,1751,1753,1756,1758,1760,1762],{"class":40,"data-line":41,"line":41},[38,1741,463],{"class":48},[38,1743,1744],{"class":55}," InitUserHandler",[38,1746,60],{"class":59},[38,1748,484],{"class":59},[38,1750,296],{"class":44},[38,1752,441],{"class":48},[38,1754,1755],{"class":55},"api",[38,1757,312],{"class":44},[38,1759,1290],{"class":55},[38,1761,296],{"class":44},[38,1763,299],{"class":59},[38,1765,1766,1768,1771,1774],{"class":40,"data-line":66,"line":66},[38,1767,306],{"class":305},[38,1769,1770],{"class":44},"wire.",[38,1772,1773],{"class":55},"Build",[38,1775,389],{"class":511},[38,1777,1778,1781,1783],{"class":40,"data-line":87,"line":87},[38,1779,1780],{"class":305},"    ",[38,1782,1780],{"class":305},[38,1784,1785],{"class":44},"config.NewGormDB, # 绑定db\n",[38,1787,1788,1790,1792],{"class":40,"data-line":108,"line":108},[38,1789,306],{"class":305},[38,1791,306],{"class":305},[38,1793,1794],{"class":44},"api.NewUserHandler,\n",[38,1796,1797,1799,1801],{"class":40,"data-line":129,"line":129},[38,1798,306],{"class":305},[38,1800,306],{"class":305},[38,1802,1803],{"class":44},"service.NewUserService,\n",[38,1805,1806,1808,1810],{"class":40,"data-line":302,"line":302},[38,1807,306],{"class":305},[38,1809,306],{"class":305},[38,1811,1812],{"class":44},"repo.NewUserRepo,\n",[38,1814,1815,1817,1819],{"class":40,"data-line":321,"line":321},[38,1816,306],{"class":305},[38,1818,306],{"class":305},[38,1820,1821],{"class":44},"dao.NewUserDao,\n",[38,1823,1824,1826,1828],{"class":40,"data-line":335,"line":335},[38,1825,306],{"class":305},[38,1827,34],{"class":44},[38,1829,63],{"class":511},[38,1831,1832,1834,1836],{"class":40,"data-line":346,"line":346},[38,1833,306],{"class":305},[38,1835,503],{"class":48},[38,1837,1838],{"class":227}," nil\n",[38,1840,1841],{"class":40,"data-line":357,"line":357},[38,1842,360],{"class":59},[1844,1845,1846],"h4",{"id":1846},"含义",[14,1848,1849],{},[17,1850,1726,1851,1854,1855],{},[24,1852,1853],{"code":1853},"wire.Build","中写入各个模块的构造函数，db->dao->repo->service->api，返回值写入你想要生成函数的返回值，通常是",[169,1856,1857],{},"最高层模块对应的结构体指针",[17,1859,1695,1860,1862],{},[24,1861,1732],{"code":1732},"中所在的目录打开终端输入：",[29,1864,1866],{"className":179,"code":1865,"language":181,"meta":34,"style":34},"wire\n",[24,1867,1868],{"__ignoreMap":34},[38,1869,1870],{"class":40,"data-line":41,"line":41},[38,1871,1865],{"class":55},[17,1873,1874],{},[169,1875,1876],{},"出现报错",[29,1878,1880],{"className":179,"code":1879,"language":181,"meta":34,"style":34},"D:\\Code\\Go\\wire-learn>wire\nwire: D:\\Code\\Go\\wire-learn\\wire.go:11:1: inject InitUserHandler: no provider found for *github.com\u002Fgin-gonic\u002Fgin.Engine\n        needed by *wire_learn\u002Finternal\u002Fuser\u002Fapi.UserHandler in provider \"NewUserHandler\" (D:\\Code\\Go\\wire-learn\\internal\\user\\api\\user.go:21:6)\nwire: D:\\Code\\Go\\wire-learn\\wire.go:11:1: inject InitUserHandler: no provider found for wire_learn\u002Finternal\u002Fuser\u002Fservice.IUserService\n        needed by *wire_learn\u002Finternal\u002Fuser\u002Fapi.UserHandler in provider \"NewUserHandler\" (D:\\Code\\Go\\wire-learn\\internal\\user\\api\\user.go:21:6)\nwire: wire_learn: generate failed\nwire: at least one generate failure\n",[24,1881,1882,1892,1946,2015,2052,2108,2121],{"__ignoreMap":34},[38,1883,1884,1887,1890],{"class":40,"data-line":41,"line":41},[38,1885,1886],{"class":55},"D:\\Code\\Go\\wire-learn",[38,1888,1889],{"class":44},">",[38,1891,1865],{"class":190},[38,1893,1894,1897,1900,1903,1906,1909,1912,1915,1918,1920,1923,1926,1929,1932,1935,1938,1941,1943],{"class":40,"data-line":66,"line":66},[38,1895,1896],{"class":55},"wire:",[38,1898,1899],{"class":190}," D:",[38,1901,1902],{"class":227},"\\C",[38,1904,1905],{"class":190},"ode",[38,1907,1908],{"class":227},"\\G",[38,1910,1911],{"class":190},"o",[38,1913,1914],{"class":227},"\\w",[38,1916,1917],{"class":190},"ire-learn",[38,1919,1914],{"class":227},[38,1921,1922],{"class":190},"ire.go:11:1:",[38,1924,1925],{"class":190}," inject",[38,1927,1928],{"class":190}," InitUserHandler:",[38,1930,1931],{"class":190}," no",[38,1933,1934],{"class":190}," provider",[38,1936,1937],{"class":190}," found",[38,1939,1940],{"class":190}," for",[38,1942,474],{"class":227},[38,1944,1945],{"class":190},"github.com\u002Fgin-gonic\u002Fgin.Engine\n",[38,1947,1948,1950,1952,1955,1958,1960,1963,1966,1968,1971,1973,1975,1978,1980,1982,1984,1986,1988,1990,1993,1996,1999,2002,2005,2008,2010,2013],{"class":40,"data-line":87,"line":87},[38,1949,1780],{"class":305},[38,1951,1780],{"class":305},[38,1953,1954],{"class":55},"needed",[38,1956,1957],{"class":190}," by",[38,1959,474],{"class":227},[38,1961,1962],{"class":190},"wire_learn\u002Finternal\u002Fuser\u002Fapi.UserHandler",[38,1964,1965],{"class":190}," in",[38,1967,1934],{"class":190},[38,1969,1970],{"class":190}," \"NewUserHandler\"",[38,1972,296],{"class":44},[38,1974,60],{"class":59},[38,1976,1977],{"class":44},"D:",[38,1979,1902],{"class":227},[38,1981,1905],{"class":44},[38,1983,1908],{"class":227},[38,1985,1911],{"class":44},[38,1987,1914],{"class":227},[38,1989,1917],{"class":44},[38,1991,1992],{"class":227},"\\i",[38,1994,1995],{"class":44},"nternal",[38,1997,1998],{"class":227},"\\u",[38,2000,2001],{"class":44},"ser",[38,2003,2004],{"class":227},"\\a",[38,2006,2007],{"class":44},"pi",[38,2009,1998],{"class":227},[38,2011,2012],{"class":44},"ser.go:21:6",[38,2014,63],{"class":59},[38,2016,2017,2019,2021,2023,2025,2027,2029,2031,2033,2035,2037,2039,2041,2043,2045,2047,2049],{"class":40,"data-line":108,"line":108},[38,2018,1896],{"class":55},[38,2020,1899],{"class":190},[38,2022,1902],{"class":227},[38,2024,1905],{"class":190},[38,2026,1908],{"class":227},[38,2028,1911],{"class":190},[38,2030,1914],{"class":227},[38,2032,1917],{"class":190},[38,2034,1914],{"class":227},[38,2036,1922],{"class":190},[38,2038,1925],{"class":190},[38,2040,1928],{"class":190},[38,2042,1931],{"class":190},[38,2044,1934],{"class":190},[38,2046,1937],{"class":190},[38,2048,1940],{"class":190},[38,2050,2051],{"class":190}," wire_learn\u002Finternal\u002Fuser\u002Fservice.IUserService\n",[38,2053,2054,2056,2058,2060,2062,2064,2066,2068,2070,2072,2074,2076,2078,2080,2082,2084,2086,2088,2090,2092,2094,2096,2098,2100,2102,2104,2106],{"class":40,"data-line":129,"line":129},[38,2055,1780],{"class":305},[38,2057,1780],{"class":305},[38,2059,1954],{"class":55},[38,2061,1957],{"class":190},[38,2063,474],{"class":227},[38,2065,1962],{"class":190},[38,2067,1965],{"class":190},[38,2069,1934],{"class":190},[38,2071,1970],{"class":190},[38,2073,296],{"class":44},[38,2075,60],{"class":59},[38,2077,1977],{"class":44},[38,2079,1902],{"class":227},[38,2081,1905],{"class":44},[38,2083,1908],{"class":227},[38,2085,1911],{"class":44},[38,2087,1914],{"class":227},[38,2089,1917],{"class":44},[38,2091,1992],{"class":227},[38,2093,1995],{"class":44},[38,2095,1998],{"class":227},[38,2097,2001],{"class":44},[38,2099,2004],{"class":227},[38,2101,2007],{"class":44},[38,2103,1998],{"class":227},[38,2105,2012],{"class":44},[38,2107,63],{"class":59},[38,2109,2110,2112,2115,2118],{"class":40,"data-line":302,"line":302},[38,2111,1896],{"class":55},[38,2113,2114],{"class":190}," wire_learn:",[38,2116,2117],{"class":190}," generate",[38,2119,2120],{"class":190}," failed\n",[38,2122,2123,2125,2128,2131,2134,2136],{"class":40,"data-line":321,"line":321},[38,2124,1896],{"class":55},[38,2126,2127],{"class":190}," at",[38,2129,2130],{"class":190}," least",[38,2132,2133],{"class":190}," one",[38,2135,2117],{"class":190},[38,2137,2138],{"class":190}," failure\n",[17,2140,2141,2142,2145],{},"在软件设计层面，一般要遵循",[24,2143,2144],{"code":2144},"依赖倒置","原则",[17,2147,2148],{},"也就是说，高层模块要维护低层模块的抽象类（接口）",[17,2150,2151,2152,2154,2155,2157],{},"代码层面，",[24,2153,1290],{"code":1290},"要维护",[24,2156,959],{"code":959},"这个接口",[29,2159,2161],{"className":31,"code":2160,"language":33,"meta":34,"style":34},"type UserHandler struct {\n\tserv service.IUserService\n}\n",[24,2162,2163,2175,2187],{"__ignoreMap":34},[38,2164,2165,2167,2169,2171,2173],{"class":40,"data-line":41,"line":41},[38,2166,287],{"class":48},[38,2168,1196],{"class":55},[38,2170,293],{"class":48},[38,2172,296],{"class":44},[38,2174,299],{"class":59},[38,2176,2177,2179,2181,2183,2185],{"class":40,"data-line":66,"line":66},[38,2178,306],{"class":305},[38,2180,1209],{"class":44},[38,2182,1212],{"class":55},[38,2184,312],{"class":44},[38,2186,1217],{"class":55},[38,2188,2189],{"class":40,"data-line":87,"line":87},[38,2190,360],{"class":59},[17,2192,2193,2194,2196,2197,2200,2201,2204,2205,2208,2209,2211,2212,2215,2216,2218,2219,2221],{},"所以说要让",[24,2195,166],{"code":166},"去识别",[24,2198,2199],{"code":2199},"某个接口","实现了",[24,2202,2203],{"code":2203},"某个结构体","，比如说",[24,2206,2207],{"code":2207},"api.NewUserHandler","返回的是",[24,2210,959],{"code":959},",而",[24,2213,2214],{"code":2214},"service.NewUserService","依赖于",[24,2217,970],{"code":970},"结构体，而不是",[24,2220,959],{"code":959},"接口，所以要绑定接口和结构体之间的关系",[174,2223,2225],{"id":2224},"第二步-wirebind","第二步 wire.Bind",[29,2227,2229],{"className":31,"code":2228,"language":33,"meta":34,"style":34},"func InitUserHandler() *service.UserService {\n\twire.Build(\n\t\tconfig.NewGormDB,\n        wire.Bind(new(repo.IUserService), new(*repo.UserService)),\n\t\twire.Bind(new(repo.IUserRepo), new(*repo.UserRepo)),\n\t\twire.Bind(new(dao.IUserDao), new(*dao.UserDao)),\n        api.NewUserHandler,\n\t\tservice.NewUserService,\n\t\trepo.NewUserRepo,\n\t\tdao.NewUserDao,\n\t)\n\treturn nil\n}\n",[24,2230,2231,2255,2265,2274,2322,2367,2412,2420,2428,2436,2444,2452,2460],{"__ignoreMap":34},[38,2232,2233,2235,2237,2239,2241,2243,2245,2247,2249,2251,2253],{"class":40,"data-line":41,"line":41},[38,2234,463],{"class":48},[38,2236,1744],{"class":55},[38,2238,60],{"class":59},[38,2240,484],{"class":59},[38,2242,296],{"class":44},[38,2244,441],{"class":48},[38,2246,1212],{"class":55},[38,2248,312],{"class":44},[38,2250,970],{"class":55},[38,2252,296],{"class":44},[38,2254,299],{"class":59},[38,2256,2257,2259,2261,2263],{"class":40,"data-line":66,"line":66},[38,2258,306],{"class":305},[38,2260,1770],{"class":44},[38,2262,1773],{"class":55},[38,2264,389],{"class":511},[38,2266,2267,2269,2271],{"class":40,"data-line":87,"line":87},[38,2268,306],{"class":305},[38,2270,306],{"class":305},[38,2272,2273],{"class":44},"config.NewGormDB,\n",[38,2275,2276,2278,2280,2282,2285,2287,2290,2292,2294,2296,2298,2300,2303,2305,2307,2309,2311,2313,2315,2317,2319],{"class":40,"data-line":108,"line":108},[38,2277,1780],{"class":305},[38,2279,1780],{"class":305},[38,2281,1770],{"class":44},[38,2283,2284],{"class":55},"Bind",[38,2286,60],{"class":794},[38,2288,2289],{"class":55},"new",[38,2291,60],{"class":59},[38,2293,893],{"class":55},[38,2295,312],{"class":44},[38,2297,959],{"class":55},[38,2299,484],{"class":59},[38,2301,2302],{"class":44},", ",[38,2304,2289],{"class":55},[38,2306,60],{"class":59},[38,2308,441],{"class":48},[38,2310,893],{"class":55},[38,2312,312],{"class":44},[38,2314,970],{"class":55},[38,2316,484],{"class":59},[38,2318,484],{"class":794},[38,2320,2321],{"class":44},",\n",[38,2323,2324,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348,2350,2352,2354,2356,2358,2361,2363,2365],{"class":40,"data-line":129,"line":129},[38,2325,306],{"class":305},[38,2327,306],{"class":305},[38,2329,1770],{"class":44},[38,2331,2284],{"class":55},[38,2333,60],{"class":794},[38,2335,2289],{"class":55},[38,2337,60],{"class":59},[38,2339,893],{"class":55},[38,2341,312],{"class":44},[38,2343,1001],{"class":55},[38,2345,484],{"class":59},[38,2347,2302],{"class":44},[38,2349,2289],{"class":55},[38,2351,60],{"class":59},[38,2353,441],{"class":48},[38,2355,893],{"class":55},[38,2357,312],{"class":44},[38,2359,2360],{"class":55},"UserRepo",[38,2362,484],{"class":59},[38,2364,484],{"class":794},[38,2366,2321],{"class":44},[38,2368,2369,2371,2373,2375,2377,2379,2381,2383,2386,2388,2390,2392,2394,2396,2398,2400,2402,2404,2406,2408,2410],{"class":40,"data-line":302,"line":302},[38,2370,306],{"class":305},[38,2372,306],{"class":305},[38,2374,1770],{"class":44},[38,2376,2284],{"class":55},[38,2378,60],{"class":794},[38,2380,2289],{"class":55},[38,2382,60],{"class":59},[38,2384,2385],{"class":55},"dao",[38,2387,312],{"class":44},[38,2389,613],{"class":55},[38,2391,484],{"class":59},[38,2393,2302],{"class":44},[38,2395,2289],{"class":55},[38,2397,60],{"class":59},[38,2399,441],{"class":48},[38,2401,2385],{"class":55},[38,2403,312],{"class":44},[38,2405,491],{"class":55},[38,2407,484],{"class":59},[38,2409,484],{"class":794},[38,2411,2321],{"class":44},[38,2413,2414,2416,2418],{"class":40,"data-line":321,"line":321},[38,2415,1780],{"class":305},[38,2417,1780],{"class":305},[38,2419,1794],{"class":44},[38,2421,2422,2424,2426],{"class":40,"data-line":335,"line":335},[38,2423,306],{"class":305},[38,2425,306],{"class":305},[38,2427,1803],{"class":44},[38,2429,2430,2432,2434],{"class":40,"data-line":346,"line":346},[38,2431,306],{"class":305},[38,2433,306],{"class":305},[38,2435,1812],{"class":44},[38,2437,2438,2440,2442],{"class":40,"data-line":357,"line":357},[38,2439,306],{"class":305},[38,2441,306],{"class":305},[38,2443,1821],{"class":44},[38,2445,2446,2448,2450],{"class":40,"data-line":455,"line":455},[38,2447,306],{"class":305},[38,2449,34],{"class":44},[38,2451,63],{"class":511},[38,2453,2454,2456,2458],{"class":40,"data-line":460,"line":460},[38,2455,306],{"class":305},[38,2457,503],{"class":48},[38,2459,1838],{"class":227},[38,2461,2462],{"class":40,"data-line":498,"line":498},[38,2463,360],{"class":59},[174,2465,2467],{"id":2466},"第三步-使用-wirenetset","第三步 使用 wire.NetSet",[17,2469,2470,2471,2474,2475,2477,2478,2480,2481,2484],{},"有时候可能多个类型有相同的依赖，我们每次都将相同的构造器传给",[24,2472,2473],{"code":2473},"wire.Build()","不仅繁琐，而且不易维护，一个依赖修改了，所有传入",[24,2476,2473],{"code":2473},"的地方都要修改。为此，",[24,2479,166],{"code":166},"提供了一个",[24,2482,2483],{"code":2483},"ProviderSet","（构造器集合），可以将多个构造器打包成一个集合，后续只需要使用这个集合即可。",[17,2486,2487,2488],{},"在 user 模块下新建",[24,2489,2490],{"code":2490},"ioc.go",[29,2492,2494],{"className":31,"code":2493,"language":33,"meta":34,"style":34},"\u002F\u002F UserProvider 依赖注入\nvar UserProvider = wire.NewSet(\n\tconfig.NewGormDB,\n    wire.Bind(new(repo.IUserService), new(*repo.UserService)),\n    wire.Bind(new(repo.IUserRepo), new(*repo.UserRepo)),\n    wire.Bind(new(dao.IUserDao), new(*dao.UserDao)),\n    api.NewUserHandler,\n    service.NewUserService,\n    repo.NewUserRepo,\n    dao.NewUserDao,\n)\n",[24,2495,2496,2501,2519,2525,2567,2609,2651,2657,2663,2669,2675],{"__ignoreMap":34},[38,2497,2498],{"class":40,"data-line":41,"line":41},[38,2499,2500],{"class":231},"\u002F\u002F UserProvider 依赖注入\n",[38,2502,2503,2505,2508,2511,2514,2517],{"class":40,"data-line":66,"line":66},[38,2504,607],{"class":48},[38,2506,2507],{"class":44}," UserProvider ",[38,2509,2510],{"class":48},"=",[38,2512,2513],{"class":44}," wire.",[38,2515,2516],{"class":55},"NewSet",[38,2518,389],{"class":59},[38,2520,2521,2523],{"class":40,"data-line":87,"line":87},[38,2522,306],{"class":305},[38,2524,2273],{"class":44},[38,2526,2527,2529,2531,2533,2535,2537,2539,2541,2543,2545,2547,2549,2551,2553,2555,2557,2559,2561,2563,2565],{"class":40,"data-line":108,"line":108},[38,2528,1780],{"class":305},[38,2530,1770],{"class":44},[38,2532,2284],{"class":55},[38,2534,60],{"class":511},[38,2536,2289],{"class":55},[38,2538,60],{"class":794},[38,2540,893],{"class":55},[38,2542,312],{"class":44},[38,2544,959],{"class":55},[38,2546,484],{"class":794},[38,2548,2302],{"class":44},[38,2550,2289],{"class":55},[38,2552,60],{"class":794},[38,2554,441],{"class":48},[38,2556,893],{"class":55},[38,2558,312],{"class":44},[38,2560,970],{"class":55},[38,2562,484],{"class":794},[38,2564,484],{"class":511},[38,2566,2321],{"class":44},[38,2568,2569,2571,2573,2575,2577,2579,2581,2583,2585,2587,2589,2591,2593,2595,2597,2599,2601,2603,2605,2607],{"class":40,"data-line":129,"line":129},[38,2570,1780],{"class":305},[38,2572,1770],{"class":44},[38,2574,2284],{"class":55},[38,2576,60],{"class":511},[38,2578,2289],{"class":55},[38,2580,60],{"class":794},[38,2582,893],{"class":55},[38,2584,312],{"class":44},[38,2586,1001],{"class":55},[38,2588,484],{"class":794},[38,2590,2302],{"class":44},[38,2592,2289],{"class":55},[38,2594,60],{"class":794},[38,2596,441],{"class":48},[38,2598,893],{"class":55},[38,2600,312],{"class":44},[38,2602,2360],{"class":55},[38,2604,484],{"class":794},[38,2606,484],{"class":511},[38,2608,2321],{"class":44},[38,2610,2611,2613,2615,2617,2619,2621,2623,2625,2627,2629,2631,2633,2635,2637,2639,2641,2643,2645,2647,2649],{"class":40,"data-line":302,"line":302},[38,2612,1780],{"class":305},[38,2614,1770],{"class":44},[38,2616,2284],{"class":55},[38,2618,60],{"class":511},[38,2620,2289],{"class":55},[38,2622,60],{"class":794},[38,2624,2385],{"class":55},[38,2626,312],{"class":44},[38,2628,613],{"class":55},[38,2630,484],{"class":794},[38,2632,2302],{"class":44},[38,2634,2289],{"class":55},[38,2636,60],{"class":794},[38,2638,441],{"class":48},[38,2640,2385],{"class":55},[38,2642,312],{"class":44},[38,2644,491],{"class":55},[38,2646,484],{"class":794},[38,2648,484],{"class":511},[38,2650,2321],{"class":44},[38,2652,2653,2655],{"class":40,"data-line":321,"line":321},[38,2654,1780],{"class":305},[38,2656,1794],{"class":44},[38,2658,2659,2661],{"class":40,"data-line":335,"line":335},[38,2660,1780],{"class":305},[38,2662,1803],{"class":44},[38,2664,2665,2667],{"class":40,"data-line":346,"line":346},[38,2666,1780],{"class":305},[38,2668,1812],{"class":44},[38,2670,2671,2673],{"class":40,"data-line":357,"line":357},[38,2672,1780],{"class":305},[38,2674,1821],{"class":44},[38,2676,2677],{"class":40,"data-line":455,"line":455},[38,2678,63],{"class":59},[17,2680,1695,2681,2684],{},[24,2682,2683],{"code":2683},"wire.Bind","中注入",[29,2686,2688],{"className":31,"code":2687,"language":33,"meta":34,"style":34},"func InitUserHandler() *service.UserService {\n\twire.Build(\n\t\tioc.UserProvider\n\t)\n\treturn nil\n}\n",[24,2689,2690,2714,2724,2733,2741,2749],{"__ignoreMap":34},[38,2691,2692,2694,2696,2698,2700,2702,2704,2706,2708,2710,2712],{"class":40,"data-line":41,"line":41},[38,2693,463],{"class":48},[38,2695,1744],{"class":55},[38,2697,60],{"class":59},[38,2699,484],{"class":59},[38,2701,296],{"class":44},[38,2703,441],{"class":48},[38,2705,1212],{"class":55},[38,2707,312],{"class":44},[38,2709,970],{"class":55},[38,2711,296],{"class":44},[38,2713,299],{"class":59},[38,2715,2716,2718,2720,2722],{"class":40,"data-line":66,"line":66},[38,2717,306],{"class":305},[38,2719,1770],{"class":44},[38,2721,1773],{"class":55},[38,2723,389],{"class":511},[38,2725,2726,2728,2730],{"class":40,"data-line":87,"line":87},[38,2727,306],{"class":305},[38,2729,306],{"class":305},[38,2731,2732],{"class":44},"ioc.UserProvider\n",[38,2734,2735,2737,2739],{"class":40,"data-line":108,"line":108},[38,2736,306],{"class":305},[38,2738,34],{"class":44},[38,2740,63],{"class":511},[38,2742,2743,2745,2747],{"class":40,"data-line":129,"line":129},[38,2744,306],{"class":305},[38,2746,503],{"class":48},[38,2748,1838],{"class":227},[38,2750,2751],{"class":40,"data-line":302,"line":302},[38,2752,360],{"class":59},[17,2754,2755,2756,2759,2760,2762],{},"这样就能有效管理",[24,2757,2758],{"code":2758},"provider","，统一引入，防止大量代码写在一个",[24,2761,1773],{"code":1773},"里面",[174,2764,2766],{"id":2765},"第四步-生成代码","第四步 生成代码",[29,2768,2770],{"className":179,"code":2769,"language":181,"meta":34,"style":34},"wire # 识别当前目录的wire.build\nwire .\u002F... # 识别当前目录和子目录\n",[24,2771,2772,2779],{"__ignoreMap":34},[38,2773,2774,2776],{"class":40,"data-line":41,"line":41},[38,2775,166],{"class":55},[38,2777,2778],{"class":231}," # 识别当前目录的wire.build\n",[38,2780,2781,2783,2786],{"class":40,"data-line":66,"line":66},[38,2782,166],{"class":55},[38,2784,2785],{"class":190}," .\u002F...",[38,2787,2788],{"class":231}," # 识别当前目录和子目录\n",[174,2790,2792],{"id":2791},"第五步-添加-wireinject","第五步 添加 wireinject",[17,2794,1726,2795,2797],{},[24,2796,1732],{"code":1732},"头部上添加",[29,2799,2801],{"className":31,"code":2800,"language":33,"meta":34,"style":34},"\u002F\u002Fgo:build wireinject\n\u002F\u002F +build wireinject\n",[24,2802,2803,2808],{"__ignoreMap":34},[38,2804,2805],{"class":40,"data-line":41,"line":41},[38,2806,2807],{"class":231},"\u002F\u002Fgo:build wireinject\n",[38,2809,2810],{"class":40,"data-line":66,"line":66},[38,2811,2812],{"class":231},"\u002F\u002F +build wireinject\n",[17,2814,2815,2816,2819],{},"因为同个包下不能有两个相同的函数名，否则报错，保留自动化生成的",[24,2817,2818],{"code":2818},"wire_gen.go","文件",[10,2821,2823],{"id":2822},"在-gin-中优雅的使用-wire","在 gin 中优雅的使用 wire",[174,2825,2826],{"id":2826},"重点",[17,2828,2829,2830,2832],{},"又回到刚刚那个问题，怎么做才能避免初始化大量的",[24,2831,153],{"code":153},"和比较有效的避免使用一些没有意义的全局变量",[17,2834,2835,2836,2839,2840,2842],{},"大多数的数据库，对象初始化应该是一个",[24,2837,2838],{"code":2838},"单例模式","，所以只能有一个 wire.go，如果说在不同的模块下建立多个",[24,2841,1732],{"code":1732},"，这样做法是错误的。",[17,2844,2845,2846,2848,2849,2852,2853],{},"为了解决",[24,2847,153],{"code":153},"的问题，应该在",[24,2850,2851],{"code":2851},"NewHandler","(即初始化 api 接口构造函数)的时候，",[169,2854,2855],{},"将 router *gin.Engine 传入,api 初始化的时候顺带挂载路由",[174,2857,2859],{"id":2858},"第一步-优化-api-层的构造函数","第一步 优化 api 层的构造函数",[29,2861,2863],{"className":31,"code":2862,"language":33,"meta":34,"style":34},"func NewUserHandler(r *gin.Engine, serv service.IUserService) *UserHandler {\n\th := &UserHandler{\n\t\tserv: serv,\n\t}\n\tv := r.Group(\"user\")\n\t{\n\t\tv.POST(\"add\", h.Login)\n\t}\n\treturn h\n}\n",[24,2864,2865,2907,2921,2929,2937,2959,2967,2989,2997,3006],{"__ignoreMap":34},[38,2866,2867,2869,2871,2873,2876,2878,2880,2882,2885,2887,2889,2891,2893,2895,2897,2899,2901,2903,2905],{"class":40,"data-line":41,"line":41},[38,2868,463],{"class":48},[38,2870,1309],{"class":55},[38,2872,60],{"class":59},[38,2874,2875],{"class":471},"r",[38,2877,474],{"class":48},[38,2879,1255],{"class":55},[38,2881,312],{"class":44},[38,2883,2884],{"class":55},"Engine",[38,2886,2302],{"class":44},[38,2888,1314],{"class":471},[38,2890,1317],{"class":55},[38,2892,312],{"class":44},[38,2894,959],{"class":55},[38,2896,484],{"class":59},[38,2898,296],{"class":44},[38,2900,441],{"class":48},[38,2902,1290],{"class":55},[38,2904,296],{"class":44},[38,2906,299],{"class":59},[38,2908,2909,2911,2913,2915,2917,2919],{"class":40,"data-line":66,"line":66},[38,2910,306],{"class":305},[38,2912,1381],{"class":44},[38,2914,49],{"class":48},[38,2916,506],{"class":48},[38,2918,1290],{"class":55},[38,2920,299],{"class":511},[38,2922,2923,2925,2927],{"class":40,"data-line":87,"line":87},[38,2924,306],{"class":305},[38,2926,306],{"class":305},[38,2928,1354],{"class":44},[38,2930,2931,2933,2935],{"class":40,"data-line":108,"line":108},[38,2932,306],{"class":305},[38,2934,34],{"class":44},[38,2936,360],{"class":511},[38,2938,2939,2941,2944,2946,2949,2952,2954,2957],{"class":40,"data-line":129,"line":129},[38,2940,306],{"class":305},[38,2942,2943],{"class":44},"v ",[38,2945,49],{"class":48},[38,2947,2948],{"class":44}," r.",[38,2950,2951],{"class":55},"Group",[38,2953,60],{"class":511},[38,2955,2956],{"class":190},"\"user\"",[38,2958,63],{"class":511},[38,2960,2961,2963,2965],{"class":40,"data-line":302,"line":302},[38,2962,306],{"class":305},[38,2964,34],{"class":44},[38,2966,299],{"class":511},[38,2968,2969,2971,2973,2976,2979,2981,2984,2987],{"class":40,"data-line":321,"line":321},[38,2970,306],{"class":305},[38,2972,306],{"class":305},[38,2974,2975],{"class":44},"v.",[38,2977,2978],{"class":55},"POST",[38,2980,60],{"class":794},[38,2982,2983],{"class":190},"\"add\"",[38,2985,2986],{"class":44},", h.Login",[38,2988,63],{"class":794},[38,2990,2991,2993,2995],{"class":40,"data-line":335,"line":335},[38,2992,306],{"class":305},[38,2994,34],{"class":44},[38,2996,360],{"class":511},[38,2998,2999,3001,3003],{"class":40,"data-line":346,"line":346},[38,3000,306],{"class":305},[38,3002,503],{"class":48},[38,3004,3005],{"class":44}," h\n",[38,3007,3008],{"class":40,"data-line":357,"line":357},[38,3009,360],{"class":59},[14,3011,3012],{},[17,3013,3014],{},"同时初始化路由",[174,3016,3018],{"id":3017},"第二步-初始化一个无中间件的-gin-服务器","第二步 初始化一个无中间件的 gin 服务器",[17,3020,3021],{},[24,3022,3023],{"code":3023},"middleware\u002Flogger.go",[29,3025,3027],{"className":31,"code":3026,"language":33,"meta":34,"style":34},"package middleware\n\nimport (\n\t\"time\"\n\n\t\"github.com\u002Fgin-gonic\u002Fgin\"\n\t\"go.uber.org\u002Fzap\"\n)\n\n\u002F\u002F GinLogger 是一个 Gin 中间件，用于记录 HTTP 请求的日志信息\nfunc GinLogger(logger *zap.Logger) gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tstart := time.Now() \u002F\u002F 记录请求开始时间\n\n\t\t\u002F\u002F 获取请求的路径和查询参数\n\t\tstatus := c.Writer.Status()\n\t\tmethod := c.Request.Method\n\t\tpath := c.Request.URL.Path\n\t\tquery := c.Request.URL.RawQuery\n\t\tclientIP := c.ClientIP()\n\t\tuserAgent := c.Request.UserAgent()\n\t\tdate := time.Now().Format(\"2006-01-02 15:04:05\")\n\n\t\t\u002F\u002F 处理请求\n\t\tc.Next()\n\n\t\t\u002F\u002F 计算请求耗时\n\t\tduration := time.Since(start)\n\n\t\t\u002F\u002F 记录日志\n\t\tlogger.Info(\n\t\t\t\"请求日志\",\n\t\t\tzap.Int(\"status\", status),\n\t\t\tzap.String(\"method\", method),\n\t\t\tzap.Duration(\"duration\", duration),\n\t\t\tzap.String(\"path\", path),\n\t\t\tzap.String(\"query\", query),\n\t\t\tzap.String(\"clientIP\", clientIP),\n\t\t\tzap.String(\"userAgent\", userAgent),\n\t\t\tzap.String(\"date\", date),\n\t\t)\n\t}\n}\n",[24,3028,3029,3036,3040,3048,3059,3063,3073,3084,3088,3092,3097,3134,3161,3187,3191,3200,3221,3235,3249,3263,3283,3304,3335,3339,3348,3364,3368,3377,3400,3404,3413,3427,3440,3466,3491,3516,3540,3564,3588,3612,3636,3646,3654],{"__ignoreMap":34},[38,3030,3031,3033],{"class":40,"data-line":41,"line":41},[38,3032,255],{"class":48},[38,3034,3035],{"class":55}," middleware\n",[38,3037,3038],{"class":40,"data-line":66,"line":66},[38,3039,264],{"emptyLinePlaceholder":263},[38,3041,3042,3044,3046],{"class":40,"data-line":87,"line":87},[38,3043,269],{"class":48},[38,3045,296],{"class":44},[38,3047,389],{"class":59},[38,3049,3050,3052,3054,3057],{"class":40,"data-line":108,"line":108},[38,3051,306],{"class":305},[38,3053,396],{"class":190},[38,3055,3056],{"class":55},"time",[38,3058,278],{"class":190},[38,3060,3061],{"class":40,"data-line":129,"line":129},[38,3062,264],{"emptyLinePlaceholder":263},[38,3064,3065,3067,3069,3071],{"class":40,"data-line":302,"line":302},[38,3066,306],{"class":305},[38,3068,396],{"class":190},[38,3070,1136],{"class":55},[38,3072,278],{"class":190},[38,3074,3075,3077,3079,3082],{"class":40,"data-line":321,"line":321},[38,3076,306],{"class":305},[38,3078,396],{"class":190},[38,3080,3081],{"class":55},"go.uber.org\u002Fzap",[38,3083,278],{"class":190},[38,3085,3086],{"class":40,"data-line":335,"line":335},[38,3087,63],{"class":59},[38,3089,3090],{"class":40,"data-line":346,"line":346},[38,3091,264],{"emptyLinePlaceholder":263},[38,3093,3094],{"class":40,"data-line":357,"line":357},[38,3095,3096],{"class":231},"\u002F\u002F GinLogger 是一个 Gin 中间件，用于记录 HTTP 请求的日志信息\n",[38,3098,3099,3101,3104,3106,3109,3111,3114,3116,3119,3121,3123,3125,3127,3130,3132],{"class":40,"data-line":455,"line":455},[38,3100,463],{"class":48},[38,3102,3103],{"class":55}," GinLogger",[38,3105,60],{"class":59},[38,3107,3108],{"class":471},"logger",[38,3110,474],{"class":48},[38,3112,3113],{"class":55},"zap",[38,3115,312],{"class":44},[38,3117,3118],{"class":55},"Logger",[38,3120,484],{"class":59},[38,3122,296],{"class":44},[38,3124,1255],{"class":55},[38,3126,312],{"class":44},[38,3128,3129],{"class":55},"HandlerFunc",[38,3131,296],{"class":44},[38,3133,299],{"class":59},[38,3135,3136,3138,3140,3143,3145,3147,3149,3151,3153,3155,3157,3159],{"class":40,"data-line":460,"line":460},[38,3137,306],{"class":305},[38,3139,503],{"class":48},[38,3141,3142],{"class":48}," func",[38,3144,60],{"class":511},[38,3146,1250],{"class":471},[38,3148,474],{"class":48},[38,3150,1255],{"class":55},[38,3152,312],{"class":44},[38,3154,1260],{"class":55},[38,3156,484],{"class":511},[38,3158,296],{"class":44},[38,3160,299],{"class":511},[38,3162,3163,3165,3167,3170,3172,3175,3178,3180,3182,3184],{"class":40,"data-line":498,"line":498},[38,3164,306],{"class":305},[38,3166,306],{"class":305},[38,3168,3169],{"class":44},"start ",[38,3171,49],{"class":48},[38,3173,3174],{"class":44}," time.",[38,3176,3177],{"class":55},"Now",[38,3179,60],{"class":794},[38,3181,484],{"class":794},[38,3183,296],{"class":44},[38,3185,3186],{"class":231},"\u002F\u002F 记录请求开始时间\n",[38,3188,3189],{"class":40,"data-line":519,"line":519},[38,3190,264],{"emptyLinePlaceholder":263},[38,3192,3193,3195,3197],{"class":40,"data-line":524,"line":524},[38,3194,306],{"class":305},[38,3196,306],{"class":305},[38,3198,3199],{"class":231},"\u002F\u002F 获取请求的路径和查询参数\n",[38,3201,3202,3204,3206,3209,3211,3214,3217,3219],{"class":40,"data-line":529,"line":529},[38,3203,306],{"class":305},[38,3205,306],{"class":305},[38,3207,3208],{"class":44},"status ",[38,3210,49],{"class":48},[38,3212,3213],{"class":44}," c.Writer.",[38,3215,3216],{"class":55},"Status",[38,3218,60],{"class":794},[38,3220,63],{"class":794},[38,3222,3223,3225,3227,3230,3232],{"class":40,"data-line":544,"line":544},[38,3224,306],{"class":305},[38,3226,306],{"class":305},[38,3228,3229],{"class":44},"method ",[38,3231,49],{"class":48},[38,3233,3234],{"class":44}," c.Request.Method\n",[38,3236,3237,3239,3241,3244,3246],{"class":40,"data-line":571,"line":571},[38,3238,306],{"class":305},[38,3240,306],{"class":305},[38,3242,3243],{"class":44},"path ",[38,3245,49],{"class":48},[38,3247,3248],{"class":44}," c.Request.URL.Path\n",[38,3250,3251,3253,3255,3258,3260],{"class":40,"data-line":594,"line":594},[38,3252,306],{"class":305},[38,3254,306],{"class":305},[38,3256,3257],{"class":44},"query ",[38,3259,49],{"class":48},[38,3261,3262],{"class":44}," c.Request.URL.RawQuery\n",[38,3264,3265,3267,3269,3272,3274,3276,3279,3281],{"class":40,"data-line":599,"line":599},[38,3266,306],{"class":305},[38,3268,306],{"class":305},[38,3270,3271],{"class":44},"clientIP ",[38,3273,49],{"class":48},[38,3275,1436],{"class":44},[38,3277,3278],{"class":55},"ClientIP",[38,3280,60],{"class":794},[38,3282,63],{"class":794},[38,3284,3285,3287,3289,3292,3294,3297,3300,3302],{"class":40,"data-line":604,"line":604},[38,3286,306],{"class":305},[38,3288,306],{"class":305},[38,3290,3291],{"class":44},"userAgent ",[38,3293,49],{"class":48},[38,3295,3296],{"class":44}," c.Request.",[38,3298,3299],{"class":55},"UserAgent",[38,3301,60],{"class":794},[38,3303,63],{"class":794},[38,3305,3306,3308,3310,3313,3315,3317,3319,3321,3323,3325,3328,3330,3333],{"class":40,"data-line":636,"line":636},[38,3307,306],{"class":305},[38,3309,306],{"class":305},[38,3311,3312],{"class":44},"date ",[38,3314,49],{"class":48},[38,3316,3174],{"class":44},[38,3318,3177],{"class":55},[38,3320,60],{"class":794},[38,3322,484],{"class":794},[38,3324,312],{"class":44},[38,3326,3327],{"class":55},"Format",[38,3329,60],{"class":794},[38,3331,3332],{"class":190},"\"2006-01-02 15:04:05\"",[38,3334,63],{"class":794},[38,3336,3337],{"class":40,"data-line":641,"line":641},[38,3338,264],{"emptyLinePlaceholder":263},[38,3340,3341,3343,3345],{"class":40,"data-line":684,"line":684},[38,3342,306],{"class":305},[38,3344,306],{"class":305},[38,3346,3347],{"class":231},"\u002F\u002F 处理请求\n",[38,3349,3350,3352,3354,3357,3360,3362],{"class":40,"data-line":708,"line":708},[38,3351,306],{"class":305},[38,3353,306],{"class":305},[38,3355,3356],{"class":44},"c.",[38,3358,3359],{"class":55},"Next",[38,3361,60],{"class":794},[38,3363,63],{"class":794},[38,3365,3366],{"class":40,"data-line":713,"line":713},[38,3367,264],{"emptyLinePlaceholder":263},[38,3369,3370,3372,3374],{"class":40,"data-line":718,"line":718},[38,3371,306],{"class":305},[38,3373,306],{"class":305},[38,3375,3376],{"class":231},"\u002F\u002F 计算请求耗时\n",[38,3378,3379,3381,3383,3386,3388,3390,3393,3395,3398],{"class":40,"data-line":756,"line":756},[38,3380,306],{"class":305},[38,3382,306],{"class":305},[38,3384,3385],{"class":44},"duration ",[38,3387,49],{"class":48},[38,3389,3174],{"class":44},[38,3391,3392],{"class":55},"Since",[38,3394,60],{"class":794},[38,3396,3397],{"class":44},"start",[38,3399,63],{"class":794},[38,3401,3402],{"class":40,"data-line":811,"line":811},[38,3403,264],{"emptyLinePlaceholder":263},[38,3405,3406,3408,3410],{"class":40,"data-line":1463,"line":1463},[38,3407,306],{"class":305},[38,3409,306],{"class":305},[38,3411,3412],{"class":231},"\u002F\u002F 记录日志\n",[38,3414,3415,3417,3419,3422,3425],{"class":40,"data-line":1486,"line":1486},[38,3416,306],{"class":305},[38,3418,306],{"class":305},[38,3420,3421],{"class":44},"logger.",[38,3423,3424],{"class":55},"Info",[38,3426,389],{"class":794},[38,3428,3429,3431,3433,3435,3438],{"class":40,"data-line":1496,"line":1496},[38,3430,306],{"class":305},[38,3432,306],{"class":305},[38,3434,306],{"class":305},[38,3436,3437],{"class":190},"\"请求日志\"",[38,3439,2321],{"class":44},[38,3441,3442,3444,3446,3448,3451,3454,3456,3459,3462,3464],{"class":40,"data-line":1505,"line":1505},[38,3443,306],{"class":305},[38,3445,306],{"class":305},[38,3447,306],{"class":305},[38,3449,3450],{"class":44},"zap.",[38,3452,3453],{"class":55},"Int",[38,3455,60],{"class":59},[38,3457,3458],{"class":190},"\"status\"",[38,3460,3461],{"class":44},", status",[38,3463,484],{"class":59},[38,3465,2321],{"class":44},[38,3467,3468,3470,3472,3474,3476,3479,3481,3484,3487,3489],{"class":40,"data-line":1523,"line":1523},[38,3469,306],{"class":305},[38,3471,306],{"class":305},[38,3473,306],{"class":305},[38,3475,3450],{"class":44},[38,3477,3478],{"class":55},"String",[38,3480,60],{"class":59},[38,3482,3483],{"class":190},"\"method\"",[38,3485,3486],{"class":44},", method",[38,3488,484],{"class":59},[38,3490,2321],{"class":44},[38,3492,3493,3495,3497,3499,3501,3504,3506,3509,3512,3514],{"class":40,"data-line":1533,"line":1533},[38,3494,306],{"class":305},[38,3496,306],{"class":305},[38,3498,306],{"class":305},[38,3500,3450],{"class":44},[38,3502,3503],{"class":55},"Duration",[38,3505,60],{"class":59},[38,3507,3508],{"class":190},"\"duration\"",[38,3510,3511],{"class":44},", duration",[38,3513,484],{"class":59},[38,3515,2321],{"class":44},[38,3517,3518,3520,3522,3524,3526,3528,3530,3533,3536,3538],{"class":40,"data-line":1543,"line":1543},[38,3519,306],{"class":305},[38,3521,306],{"class":305},[38,3523,306],{"class":305},[38,3525,3450],{"class":44},[38,3527,3478],{"class":55},[38,3529,60],{"class":59},[38,3531,3532],{"class":190},"\"path\"",[38,3534,3535],{"class":44},", path",[38,3537,484],{"class":59},[38,3539,2321],{"class":44},[38,3541,3542,3544,3546,3548,3550,3552,3554,3557,3560,3562],{"class":40,"data-line":1553,"line":1553},[38,3543,306],{"class":305},[38,3545,306],{"class":305},[38,3547,306],{"class":305},[38,3549,3450],{"class":44},[38,3551,3478],{"class":55},[38,3553,60],{"class":59},[38,3555,3556],{"class":190},"\"query\"",[38,3558,3559],{"class":44},", query",[38,3561,484],{"class":59},[38,3563,2321],{"class":44},[38,3565,3566,3568,3570,3572,3574,3576,3578,3581,3584,3586],{"class":40,"data-line":1562,"line":1562},[38,3567,306],{"class":305},[38,3569,306],{"class":305},[38,3571,306],{"class":305},[38,3573,3450],{"class":44},[38,3575,3478],{"class":55},[38,3577,60],{"class":59},[38,3579,3580],{"class":190},"\"clientIP\"",[38,3582,3583],{"class":44},", clientIP",[38,3585,484],{"class":59},[38,3587,2321],{"class":44},[38,3589,3590,3592,3594,3596,3598,3600,3602,3605,3608,3610],{"class":40,"data-line":1583,"line":1583},[38,3591,306],{"class":305},[38,3593,306],{"class":305},[38,3595,306],{"class":305},[38,3597,3450],{"class":44},[38,3599,3478],{"class":55},[38,3601,60],{"class":59},[38,3603,3604],{"class":190},"\"userAgent\"",[38,3606,3607],{"class":44},", userAgent",[38,3609,484],{"class":59},[38,3611,2321],{"class":44},[38,3613,3614,3616,3618,3620,3622,3624,3626,3629,3632,3634],{"class":40,"data-line":1600,"line":1600},[38,3615,306],{"class":305},[38,3617,306],{"class":305},[38,3619,306],{"class":305},[38,3621,3450],{"class":44},[38,3623,3478],{"class":55},[38,3625,60],{"class":59},[38,3627,3628],{"class":190},"\"date\"",[38,3630,3631],{"class":44},", date",[38,3633,484],{"class":59},[38,3635,2321],{"class":44},[38,3637,3638,3640,3642,3644],{"class":40,"data-line":1625,"line":1625},[38,3639,306],{"class":305},[38,3641,306],{"class":305},[38,3643,34],{"class":44},[38,3645,63],{"class":794},[38,3647,3648,3650,3652],{"class":40,"data-line":1634,"line":1634},[38,3649,306],{"class":305},[38,3651,34],{"class":44},[38,3653,360],{"class":511},[38,3655,3656],{"class":40,"data-line":1643,"line":1643},[38,3657,360],{"class":59},[17,3659,3660],{},[24,3661,3662],{"code":3662},"config\u002FinitGin.go",[29,3664,3666],{"className":31,"code":3665,"language":33,"meta":34,"style":34},"package config\n\nimport (\n\t\"github.com\u002Fgin-gonic\u002Fgin\"\n\t\"go.uber.org\u002Fzap\"\n\t\"wire_learn\u002Fpkg\u002Fmiddleware\"\n)\n\nfunc NewGin(logger *zap.Logger) *gin.Engine {\n\tr := gin.New()\n\tr.Use(middleware.GinLogger(logger))\n    \u002F\u002F 使用其他中间件\n    ...\n\treturn r\n}\n",[24,3667,3668,3675,3679,3687,3697,3707,3718,3722,3726,3761,3779,3805,3812,3819,3828],{"__ignoreMap":34},[38,3669,3670,3672],{"class":40,"data-line":41,"line":41},[38,3671,255],{"class":48},[38,3673,3674],{"class":55}," config\n",[38,3676,3677],{"class":40,"data-line":66,"line":66},[38,3678,264],{"emptyLinePlaceholder":263},[38,3680,3681,3683,3685],{"class":40,"data-line":87,"line":87},[38,3682,269],{"class":48},[38,3684,296],{"class":44},[38,3686,389],{"class":59},[38,3688,3689,3691,3693,3695],{"class":40,"data-line":108,"line":108},[38,3690,306],{"class":305},[38,3692,396],{"class":190},[38,3694,1136],{"class":55},[38,3696,278],{"class":190},[38,3698,3699,3701,3703,3705],{"class":40,"data-line":129,"line":129},[38,3700,306],{"class":305},[38,3702,396],{"class":190},[38,3704,3081],{"class":55},[38,3706,278],{"class":190},[38,3708,3709,3711,3713,3716],{"class":40,"data-line":302,"line":302},[38,3710,306],{"class":305},[38,3712,396],{"class":190},[38,3714,3715],{"class":55},"wire_learn\u002Fpkg\u002Fmiddleware",[38,3717,278],{"class":190},[38,3719,3720],{"class":40,"data-line":321,"line":321},[38,3721,63],{"class":59},[38,3723,3724],{"class":40,"data-line":335,"line":335},[38,3725,264],{"emptyLinePlaceholder":263},[38,3727,3728,3730,3733,3735,3737,3739,3741,3743,3745,3747,3749,3751,3753,3755,3757,3759],{"class":40,"data-line":346,"line":346},[38,3729,463],{"class":48},[38,3731,3732],{"class":55}," NewGin",[38,3734,60],{"class":59},[38,3736,3108],{"class":471},[38,3738,474],{"class":48},[38,3740,3113],{"class":55},[38,3742,312],{"class":44},[38,3744,3118],{"class":55},[38,3746,484],{"class":59},[38,3748,296],{"class":44},[38,3750,441],{"class":48},[38,3752,1255],{"class":55},[38,3754,312],{"class":44},[38,3756,2884],{"class":55},[38,3758,296],{"class":44},[38,3760,299],{"class":59},[38,3762,3763,3765,3767,3769,3772,3775,3777],{"class":40,"data-line":357,"line":357},[38,3764,306],{"class":305},[38,3766,650],{"class":44},[38,3768,49],{"class":48},[38,3770,3771],{"class":44}," gin.",[38,3773,3774],{"class":55},"New",[38,3776,60],{"class":511},[38,3778,63],{"class":511},[38,3780,3781,3783,3786,3789,3791,3794,3797,3799,3801,3803],{"class":40,"data-line":455,"line":455},[38,3782,306],{"class":305},[38,3784,3785],{"class":44},"r.",[38,3787,3788],{"class":55},"Use",[38,3790,60],{"class":511},[38,3792,3793],{"class":44},"middleware.",[38,3795,3796],{"class":55},"GinLogger",[38,3798,60],{"class":794},[38,3800,3108],{"class":44},[38,3802,484],{"class":794},[38,3804,63],{"class":511},[38,3806,3807,3809],{"class":40,"data-line":460,"line":460},[38,3808,1780],{"class":305},[38,3810,3811],{"class":231},"\u002F\u002F 使用其他中间件\n",[38,3813,3814,3816],{"class":40,"data-line":498,"line":498},[38,3815,1780],{"class":305},[38,3817,3818],{"class":48},"...\n",[38,3820,3821,3823,3825],{"class":40,"data-line":519,"line":519},[38,3822,306],{"class":305},[38,3824,503],{"class":48},[38,3826,3827],{"class":44}," r\n",[38,3829,3830],{"class":40,"data-line":524,"line":524},[38,3831,360],{"class":59},[14,3833,3834],{},[17,3835,3836],{},"还可添加 cors，recover 等中间件",[174,3838,3840],{"id":3839},"第三步-初始化-httpserver","第三步. 初始化 httpServer",[29,3842,3844],{"className":31,"code":3843,"language":33,"meta":34,"style":34},"type HttpServer struct {\n\tEngine  *gin.Engine\n\tUserApi *api.UserHandler\n}\n\nfunc (receiver *HttpServer) Runserver() {\n\t\u002F\u002F 加载env配置\n\n    \u002F\u002F casbin配置\n\n    ...\n\t\u002F\u002F 启动gin服务端\n\treceiver.Engine.Run()\n}\n",[24,3845,3846,3859,3875,3891,3895,3899,3930,3937,3941,3948,3952,3958,3965,3979],{"__ignoreMap":34},[38,3847,3848,3850,3853,3855,3857],{"class":40,"data-line":41,"line":41},[38,3849,287],{"class":48},[38,3851,3852],{"class":55}," HttpServer",[38,3854,293],{"class":48},[38,3856,296],{"class":44},[38,3858,299],{"class":59},[38,3860,3861,3863,3866,3868,3870,3872],{"class":40,"data-line":66,"line":66},[38,3862,306],{"class":305},[38,3864,3865],{"class":44},"Engine  ",[38,3867,441],{"class":48},[38,3869,1255],{"class":55},[38,3871,312],{"class":44},[38,3873,3874],{"class":55},"Engine\n",[38,3876,3877,3879,3882,3884,3886,3888],{"class":40,"data-line":87,"line":87},[38,3878,306],{"class":305},[38,3880,3881],{"class":44},"UserApi ",[38,3883,441],{"class":48},[38,3885,1755],{"class":55},[38,3887,312],{"class":44},[38,3889,3890],{"class":55},"UserHandler\n",[38,3892,3893],{"class":40,"data-line":108,"line":108},[38,3894,360],{"class":59},[38,3896,3897],{"class":40,"data-line":129,"line":129},[38,3898,264],{"emptyLinePlaceholder":263},[38,3900,3901,3903,3905,3907,3910,3912,3915,3917,3919,3922,3924,3926,3928],{"class":40,"data-line":302,"line":302},[38,3902,463],{"class":48},[38,3904,296],{"class":44},[38,3906,60],{"class":59},[38,3908,3909],{"class":471},"receiver ",[38,3911,441],{"class":48},[38,3913,3914],{"class":55},"HttpServer",[38,3916,484],{"class":59},[38,3918,296],{"class":44},[38,3920,3921],{"class":55},"Runserver",[38,3923,60],{"class":59},[38,3925,484],{"class":59},[38,3927,296],{"class":44},[38,3929,299],{"class":59},[38,3931,3932,3934],{"class":40,"data-line":321,"line":321},[38,3933,306],{"class":305},[38,3935,3936],{"class":231},"\u002F\u002F 加载env配置\n",[38,3938,3939],{"class":40,"data-line":335,"line":335},[38,3940,264],{"emptyLinePlaceholder":263},[38,3942,3943,3945],{"class":40,"data-line":346,"line":346},[38,3944,1780],{"class":305},[38,3946,3947],{"class":231},"\u002F\u002F casbin配置\n",[38,3949,3950],{"class":40,"data-line":357,"line":357},[38,3951,264],{"emptyLinePlaceholder":263},[38,3953,3954,3956],{"class":40,"data-line":455,"line":455},[38,3955,1780],{"class":305},[38,3957,3818],{"class":48},[38,3959,3960,3962],{"class":40,"data-line":460,"line":460},[38,3961,306],{"class":305},[38,3963,3964],{"class":231},"\u002F\u002F 启动gin服务端\n",[38,3966,3967,3969,3972,3975,3977],{"class":40,"data-line":498,"line":498},[38,3968,306],{"class":305},[38,3970,3971],{"class":44},"receiver.Engine.",[38,3973,3974],{"class":55},"Run",[38,3976,60],{"class":511},[38,3978,63],{"class":511},[38,3980,3981],{"class":40,"data-line":519,"line":519},[38,3982,360],{"class":59},[14,3984,3985],{},[17,3986,3987,3988,3990],{},"定义了一个",[24,3989,3914],{"code":3914},"的结构体，里面有 Engine，UserApi 两个字段，目的就是在初始化完 gin 服务器后，再通过 Engine 对象去初始化路由，然后通过 wire，将前面的一系列的封装成一个 initApp 函数，返回*HttpServer 对象",[174,3992,3994],{"id":3993},"第四步-生成-wire_gengo","第四步 生成 wire_gen.go",[17,3996,3997,3999],{},[24,3998,1732],{"code":1732},"代码",[29,4001,4003],{"className":31,"code":4002,"language":33,"meta":34,"style":34},"func InitApp() *config.HttpServer {\n\twire.Build(\n\t\twire.Struct(new(config.HttpServer), \"*\"),\n\t\tconfig.NewGormDB,\n\t\tconfig.NewLogger,\n\t\tconfig.NewGin,\n\t\tuser.UserProvider,\n\t)\n\treturn nil\n}\n",[24,4004,4005,4031,4041,4075,4083,4092,4101,4110,4118,4126],{"__ignoreMap":34},[38,4006,4007,4009,4012,4014,4016,4018,4020,4023,4025,4027,4029],{"class":40,"data-line":41,"line":41},[38,4008,463],{"class":48},[38,4010,4011],{"class":55}," InitApp",[38,4013,60],{"class":59},[38,4015,484],{"class":59},[38,4017,296],{"class":44},[38,4019,441],{"class":48},[38,4021,4022],{"class":55},"config",[38,4024,312],{"class":44},[38,4026,3914],{"class":55},[38,4028,296],{"class":44},[38,4030,299],{"class":59},[38,4032,4033,4035,4037,4039],{"class":40,"data-line":66,"line":66},[38,4034,306],{"class":305},[38,4036,1770],{"class":44},[38,4038,1773],{"class":55},[38,4040,389],{"class":511},[38,4042,4043,4045,4047,4049,4052,4054,4056,4058,4060,4062,4064,4066,4068,4071,4073],{"class":40,"data-line":87,"line":87},[38,4044,306],{"class":305},[38,4046,306],{"class":305},[38,4048,1770],{"class":44},[38,4050,4051],{"class":55},"Struct",[38,4053,60],{"class":794},[38,4055,2289],{"class":55},[38,4057,60],{"class":59},[38,4059,4022],{"class":55},[38,4061,312],{"class":44},[38,4063,3914],{"class":55},[38,4065,484],{"class":59},[38,4067,2302],{"class":44},[38,4069,4070],{"class":190},"\"*\"",[38,4072,484],{"class":794},[38,4074,2321],{"class":44},[38,4076,4077,4079,4081],{"class":40,"data-line":108,"line":108},[38,4078,306],{"class":305},[38,4080,306],{"class":305},[38,4082,2273],{"class":44},[38,4084,4085,4087,4089],{"class":40,"data-line":129,"line":129},[38,4086,306],{"class":305},[38,4088,306],{"class":305},[38,4090,4091],{"class":44},"config.NewLogger,\n",[38,4093,4094,4096,4098],{"class":40,"data-line":302,"line":302},[38,4095,306],{"class":305},[38,4097,306],{"class":305},[38,4099,4100],{"class":44},"config.NewGin,\n",[38,4102,4103,4105,4107],{"class":40,"data-line":321,"line":321},[38,4104,306],{"class":305},[38,4106,306],{"class":305},[38,4108,4109],{"class":44},"user.UserProvider,\n",[38,4111,4112,4114,4116],{"class":40,"data-line":335,"line":335},[38,4113,306],{"class":305},[38,4115,34],{"class":44},[38,4117,63],{"class":511},[38,4119,4120,4122,4124],{"class":40,"data-line":346,"line":346},[38,4121,306],{"class":305},[38,4123,503],{"class":48},[38,4125,1838],{"class":227},[38,4127,4128],{"class":40,"data-line":357,"line":357},[38,4129,360],{"class":59},[17,4131,4132,4135,4136],{},[24,4133,4134],{"code":4134},"wire.Struct(new(config.HttpServer), \"*\")","实际上是初始化 HttpServer 对象，",[169,4137,4138,4139,4141],{},"wire.Build 除了构造函数也可以识别这种格式，",[24,4140,441],{"code":441},"代表所有字段",[174,4143,4145],{"id":4144},"第五步-执行-wire","第五步 执行 wire",[29,4147,4148],{"className":179,"code":1865,"language":181,"meta":34,"style":34},[24,4149,4150],{"__ignoreMap":34},[38,4151,4152],{"class":40,"data-line":41,"line":41},[38,4153,1865],{"class":55},[17,4155,4156],{},"生成代码如下",[29,4158,4160],{"className":31,"code":4159,"language":33,"meta":34,"style":34},"\u002F\u002F Injectors from wire.go:\n\nfunc InitApp() *config.HttpServer {\n\tlogger := config.NewLogger()\n\tengine := config.NewGin(logger)\n\tdb := config.NewGormDB()\n\tuserDao := dao.NewUserDao(db)\n\tuserRepo := repo.NewUserRepo(userDao)\n\tuserService := service.NewUserService(userRepo)\n\tuserHandler := api.NewUserHandler(engine, userService)\n\thttpServer := &config.HttpServer{\n\t\tEngine:  engine,\n\t\tUserApi: userHandler,\n\t}\n\treturn httpServer\n}\n",[24,4161,4162,4167,4171,4195,4213,4233,4249,4267,4285,4303,4322,4341,4350,4359,4367,4376],{"__ignoreMap":34},[38,4163,4164],{"class":40,"data-line":41,"line":41},[38,4165,4166],{"class":231},"\u002F\u002F Injectors from wire.go:\n",[38,4168,4169],{"class":40,"data-line":66,"line":66},[38,4170,264],{"emptyLinePlaceholder":263},[38,4172,4173,4175,4177,4179,4181,4183,4185,4187,4189,4191,4193],{"class":40,"data-line":87,"line":87},[38,4174,463],{"class":48},[38,4176,4011],{"class":55},[38,4178,60],{"class":59},[38,4180,484],{"class":59},[38,4182,296],{"class":44},[38,4184,441],{"class":48},[38,4186,4022],{"class":55},[38,4188,312],{"class":44},[38,4190,3914],{"class":55},[38,4192,296],{"class":44},[38,4194,299],{"class":59},[38,4196,4197,4199,4202,4204,4206,4209,4211],{"class":40,"data-line":108,"line":108},[38,4198,306],{"class":305},[38,4200,4201],{"class":44},"logger ",[38,4203,49],{"class":48},[38,4205,52],{"class":44},[38,4207,4208],{"class":55},"NewLogger",[38,4210,60],{"class":511},[38,4212,63],{"class":511},[38,4214,4215,4217,4220,4222,4224,4227,4229,4231],{"class":40,"data-line":129,"line":129},[38,4216,306],{"class":305},[38,4218,4219],{"class":44},"engine ",[38,4221,49],{"class":48},[38,4223,52],{"class":44},[38,4225,4226],{"class":55},"NewGin",[38,4228,60],{"class":511},[38,4230,3108],{"class":44},[38,4232,63],{"class":511},[38,4234,4235,4237,4239,4241,4243,4245,4247],{"class":40,"data-line":302,"line":302},[38,4236,306],{"class":305},[38,4238,45],{"class":44},[38,4240,49],{"class":48},[38,4242,52],{"class":44},[38,4244,56],{"class":55},[38,4246,60],{"class":511},[38,4248,63],{"class":511},[38,4250,4251,4253,4255,4257,4259,4261,4263,4265],{"class":40,"data-line":321,"line":321},[38,4252,306],{"class":305},[38,4254,69],{"class":44},[38,4256,49],{"class":48},[38,4258,74],{"class":44},[38,4260,77],{"class":55},[38,4262,60],{"class":511},[38,4264,82],{"class":44},[38,4266,63],{"class":511},[38,4268,4269,4271,4273,4275,4277,4279,4281,4283],{"class":40,"data-line":335,"line":335},[38,4270,306],{"class":305},[38,4272,90],{"class":44},[38,4274,49],{"class":48},[38,4276,95],{"class":44},[38,4278,98],{"class":55},[38,4280,60],{"class":511},[38,4282,103],{"class":44},[38,4284,63],{"class":511},[38,4286,4287,4289,4291,4293,4295,4297,4299,4301],{"class":40,"data-line":346,"line":346},[38,4288,306],{"class":305},[38,4290,111],{"class":44},[38,4292,49],{"class":48},[38,4294,116],{"class":44},[38,4296,119],{"class":55},[38,4298,60],{"class":511},[38,4300,124],{"class":44},[38,4302,63],{"class":511},[38,4304,4305,4307,4309,4311,4313,4315,4317,4320],{"class":40,"data-line":357,"line":357},[38,4306,306],{"class":305},[38,4308,132],{"class":44},[38,4310,49],{"class":48},[38,4312,137],{"class":44},[38,4314,140],{"class":55},[38,4316,60],{"class":511},[38,4318,4319],{"class":44},"engine, userService",[38,4321,63],{"class":511},[38,4323,4324,4326,4329,4331,4333,4335,4337,4339],{"class":40,"data-line":455,"line":455},[38,4325,306],{"class":305},[38,4327,4328],{"class":44},"httpServer ",[38,4330,49],{"class":48},[38,4332,506],{"class":48},[38,4334,4022],{"class":55},[38,4336,312],{"class":44},[38,4338,3914],{"class":55},[38,4340,299],{"class":511},[38,4342,4343,4345,4347],{"class":40,"data-line":460,"line":460},[38,4344,306],{"class":305},[38,4346,306],{"class":305},[38,4348,4349],{"class":44},"Engine:  engine,\n",[38,4351,4352,4354,4356],{"class":40,"data-line":498,"line":498},[38,4353,306],{"class":305},[38,4355,306],{"class":305},[38,4357,4358],{"class":44},"UserApi: userHandler,\n",[38,4360,4361,4363,4365],{"class":40,"data-line":519,"line":519},[38,4362,306],{"class":305},[38,4364,34],{"class":44},[38,4366,360],{"class":511},[38,4368,4369,4371,4373],{"class":40,"data-line":524,"line":524},[38,4370,306],{"class":305},[38,4372,503],{"class":48},[38,4374,4375],{"class":44}," httpServer\n",[38,4377,4378],{"class":40,"data-line":529,"line":529},[38,4379,360],{"class":59},[174,4381,4383],{"id":4382},"第六步-maingo-中调用","第六步 main.go 中调用",[29,4385,4387],{"className":31,"code":4386,"language":33,"meta":34,"style":34},"package main\n\nfunc main() {\n\tapp := InitApp()\n\tapp.Runserver()\n}\n",[24,4388,4389,4396,4400,4415,4430,4443],{"__ignoreMap":34},[38,4390,4391,4393],{"class":40,"data-line":41,"line":41},[38,4392,255],{"class":48},[38,4394,4395],{"class":55}," main\n",[38,4397,4398],{"class":40,"data-line":66,"line":66},[38,4399,264],{"emptyLinePlaceholder":263},[38,4401,4402,4404,4407,4409,4411,4413],{"class":40,"data-line":87,"line":87},[38,4403,463],{"class":48},[38,4405,4406],{"class":55}," main",[38,4408,60],{"class":59},[38,4410,484],{"class":59},[38,4412,296],{"class":44},[38,4414,299],{"class":59},[38,4416,4417,4419,4422,4424,4426,4428],{"class":40,"data-line":108,"line":108},[38,4418,306],{"class":305},[38,4420,4421],{"class":44},"app ",[38,4423,49],{"class":48},[38,4425,4011],{"class":55},[38,4427,60],{"class":511},[38,4429,63],{"class":511},[38,4431,4432,4434,4437,4439,4441],{"class":40,"data-line":129,"line":129},[38,4433,306],{"class":305},[38,4435,4436],{"class":44},"app.",[38,4438,3921],{"class":55},[38,4440,60],{"class":511},[38,4442,63],{"class":511},[38,4444,4445],{"class":40,"data-line":302,"line":302},[38,4446,360],{"class":59},[17,4448,4449],{},[4450,4451],"img",{"alt":4452,"src":4453},"image-20250215163501665","https:\u002F\u002Fcdn.jsdelivr.net\u002Fgh\u002Fcodepzj\u002Fimages@main\u002F202502151635481.png",[10,4455,4456],{"id":4456},"总结",[14,4458,4459],{},[17,4460,4461],{},"将 handler 挂载到 httpServer 结构体当中，如果你新增子模块，只需在 httpServer 加入对应的 handler 和 build 加入对应的 provider，就能自动管理路由，而不需要手动分包初始化，是不是非常方便 😎😎😎",[17,4463,4464],{},"Wire 是一个强大的依赖注入工具，可以帮助你更好地管理 Go 项目的依赖关系，提高代码的可维护性和可测试性。虽然学习曲线比较陡峭，但对于大型项目来说，使用 Wire 可以带来显著的好处。在使用 Wire 的过程中，需要注意错误处理、循环依赖、单例模式、编译时间等问题。尤其是在与 gin 结合使用时，需要注意 API Handler 和中间件的初始化方式。",[17,4466,4467],{},[169,4468,4469],{},"还有一点的是小项目可能体现不出来优势，大项目用 wire 管理是一种非常方便的选择",[174,4471,4472],{"id":4472},"参考资料",[1673,4474,4475,4481],{},[1676,4476,4477],{},[161,4478,4479],{"href":4479,"rel":4480},"https:\u002F\u002Fdarjun.github.io\u002F2020\u002F03\u002F02\u002Fgodailylib\u002Fwire\u002F",[165],[1676,4482,4483],{},[161,4484,4485],{"href":4485,"rel":4486},"https:\u002F\u002Fchenmingyong.cn\u002Fposts\u002Fgo-wire",[165],[4488,4489,4490],"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 .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 .sj4cs, html code.shiki .sj4cs{--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 .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}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":34,"searchDepth":108,"depth":108,"links":4492},[4493,4494,4499,4505,4506,4515,4524],{"id":12,"depth":66,"text":12},{"id":157,"depth":66,"text":157,"children":4495},[4496,4497,4498],{"id":176,"depth":87,"text":176},{"id":197,"depth":87,"text":197},{"id":215,"depth":87,"text":215},{"id":235,"depth":66,"text":235,"children":4500},[4501,4502,4503,4504],{"id":244,"depth":87,"text":245},{"id":363,"depth":87,"text":364},{"id":816,"depth":87,"text":817},{"id":1102,"depth":87,"text":1103},{"id":1664,"depth":66,"text":1665},{"id":1713,"depth":66,"text":1714,"children":4507},[4508,4511,4512,4513,4514],{"id":1722,"depth":87,"text":1723,"children":4509},[4510],{"id":1846,"depth":108,"text":1846},{"id":2224,"depth":87,"text":2225},{"id":2466,"depth":87,"text":2467},{"id":2765,"depth":87,"text":2766},{"id":2791,"depth":87,"text":2792},{"id":2822,"depth":66,"text":2823,"children":4516},[4517,4518,4519,4520,4521,4522,4523],{"id":2826,"depth":87,"text":2826},{"id":2858,"depth":87,"text":2859},{"id":3017,"depth":87,"text":3018},{"id":3839,"depth":87,"text":3840},{"id":3993,"depth":87,"text":3994},{"id":4144,"depth":87,"text":4145},{"id":4382,"depth":87,"text":4383},{"id":4456,"depth":66,"text":4456,"children":4525},[4526],{"id":4472,"depth":87,"text":4472},[4528],"Go语言","2025-07-26","Wire 是 Google 开发的 Go 依赖注入工具，通过自动生成代码管理模块依赖关系，解决手动初始化导致的混乱问题。它使用 wire.Build 定义依赖链，支持接口绑定和构造器集合，执行 wire 命令即可生成初始化代码。虽然学习成本较高，但能显著提升大型项目的可维护性，特别适合与 Gin 等框架集成使用。需注意处理循环依赖和接口绑定，小项目可能增加复杂度。",false,"md",null,{"slots":4535},{},"\u002F2025\u002F07\u002Fgo-wire",{"text":4538,"minutes":4539,"time":4540,"words":4541},"10 min read",9.555,573300,1911,{"title":5,"description":4530},{"loc":4536},"posts\u002F2025\u002F07\u002Fgo-wire",[166],"tech","2025-08-21","U6YbWE0t-ldDYBHDX2PnkjfGXcckd1Dz_bPIWJx-xyE",[4550,4554],{"title":4551,"path":4552,"stem":4553,"date":4529,"type":4546,"children":-1},"Go 单元测试与覆盖率实践","\u002F2025\u002F07\u002Fgo-test","posts\u002F2025\u002F07\u002Fgo-test",{"title":4555,"path":4556,"stem":4557,"date":4558,"type":4546,"children":-1},"Go 使用 Gomail 发送邮件","\u002F2025\u002F07\u002Fgomail","posts\u002F2025\u002F07\u002Fgomail","2025-07-28",1786555056859]