【Go Web開發(fā)】新手入門

開始

在本書的第一部分剪决,我們將建一個項(xiàng)目框架梢薪,并為構(gòu)建我們的Greenlight API打下基礎(chǔ)耻讽。我們將:

  • 為項(xiàng)目創(chuàng)建一個框架目錄結(jié)構(gòu)有决,并從宏觀上解釋我們的Go代碼和其他文件將如何組織。
  • 建立HTTP服務(wù)器來監(jiān)聽傳入的HTTP請求污桦。
  • 介紹一個合適的管理配置模式(通過命令行flags)并使用依賴項(xiàng)注入使依賴項(xiàng)在我們的處理程序可用亩歹。
  • 使用httprouter包實(shí)現(xiàn)API路由,達(dá)到標(biāo)準(zhǔn)RESTful結(jié)構(gòu)凡橱。

項(xiàng)目配制和代碼結(jié)構(gòu)

首先創(chuàng)建一個greenlight目錄小作,作為這個項(xiàng)目的家目錄。我將在$HOME/Projects/greenlight上創(chuàng)建我的項(xiàng)目目錄稼钩,但如果你愿意顾稀,可以自由選擇不同的位置。

 $ mkdir -p $HOME/Projects/greenlight

然后切換到這個目錄坝撑,使用go mod init命令為項(xiàng)目啟用模塊静秆。

運(yùn)行此命令時粮揉,您需要指定模塊路徑,這實(shí)際上是項(xiàng)目的唯一標(biāo)識符抚笔。在本書中扶认,我將使用greenlight.alexedwards.net作為我的模塊路徑,如果你跟隨操作的話殊橙,你應(yīng)該把它替換成你自己的路徑辐宾。

$ cd $HOME/Projects/greenlight
$ go mod init greenlight.alexedwards.net
go: creating new go.mod: module greenlight.alexedwards.net

此時你將在項(xiàng)目的根目錄下看到go.mod文件被創(chuàng)建了。如果你打開該文件膨蛮,內(nèi)容類似如下所示:

File: go.mod

module greenlight.alexedwards.net

go 1.16

在第一本Let’s Go書中詳細(xì)討論了Go module叠纹,但作為快速復(fù)習(xí),我們在這里回顧一下要點(diǎn)敞葛。

  • 當(dāng)在你項(xiàng)目的根路徑下面有一個合法的go.mod文件的話誉察,說明你的項(xiàng)目是一個模塊。
  • 當(dāng)你在項(xiàng)目中工作時制肮,使用go get去下載依賴包冒窍,然后對應(yīng)特定版本的依賴包將在go.mod中記錄。因?yàn)榘姹臼谴_定的豺鼻,所以很容易在其他的機(jī)器或環(huán)境中執(zhí)行代碼。
  • 當(dāng)你在項(xiàng)目中運(yùn)行或構(gòu)建代碼款慨,Go將使用go.mod中記錄的特定依賴儒飒。如果需要的依賴并不在當(dāng)前機(jī)器中,Go將自動為你下載檩奠,以及任何遞歸依賴桩了。
  • go.mod文件還定義了模塊路徑(就是前面說的greenlight.alexedwards.net)。這將用作項(xiàng)目中包導(dǎo)入的根路徑標(biāo)識符埠戳。
  • 讓模塊根路徑保持唯一性井誉,是一個好的編碼習(xí)慣。Go社區(qū)的常見約定是使用你的URL作為模塊根路徑整胃。

如果你不確定go module的工作原理颗圣,可以查看Go module wiki,包含很多FAQ-注意可能有些內(nèi)容已經(jīng)過時屁使。

生成目錄結(jié)構(gòu)

現(xiàn)在project目錄已經(jīng)創(chuàng)建好了并包含go.mod文件在岂,可以繼續(xù)執(zhí)行以下命令創(chuàng)建項(xiàng)目結(jié)構(gòu):

$ mkdir -p bin cmd/api internal migrations remote 
$ touch Makefile
$ touch cmd/api/main.go

此時項(xiàng)目的目錄結(jié)構(gòu)應(yīng)該如下所示的樣子:

.
|____cmd
| |____api
|      |____main.go
|____migrations
|____go.mod
|____bin
|____Makefile
|____internal
|____remote

我們花點(diǎn)時間來討論這些文件和文件夾,并解釋它們在項(xiàng)目中所起的作用蛮寂。

  • bin目錄包含應(yīng)用編譯后的二進(jìn)制文件蔽午,可直接部署到生成環(huán)境中。
  • cmd/api目錄包含Greenlight項(xiàng)目的API代碼文件酬蹋。包括運(yùn)行HTTP服務(wù)器及老、讀寫HTTP請求以及認(rèn)證管理等代碼抽莱。
  • internal目錄包含API使用的各種輔助包。包括與數(shù)據(jù)庫交互骄恶、數(shù)據(jù)校驗(yàn)食铐、發(fā)送郵件等虱歪⊥讲郑基本上任何非應(yīng)用特定但可復(fù)用的代碼都放在這里。在cmd/api中的代碼會導(dǎo)入internal目錄的代碼(但從來沒有反過來導(dǎo)入的)
  • imgrations目錄包含數(shù)據(jù)庫SQL遷移文件癌别。
  • remote目錄包含配制文件和設(shè)置腳本悔捶。
  • go.mod文件申明項(xiàng)目依賴铃慷,版本和module路徑。
  • Makefile文件包含常見自動執(zhí)行管理任務(wù)的方法蜕该,例如:代碼審計(jì)犁柜、構(gòu)建二進(jìn)制文件和執(zhí)行數(shù)據(jù)庫遷移。

要重點(diǎn)指出的是internal目錄在Go中有特殊的含義:在這個目錄中的任何包堂淡,只能被該目錄的父目錄導(dǎo)入使用馋缅。在我們的項(xiàng)目中,這意味著internal中的所有包只能被greenlight項(xiàng)目中代碼所引用绢淀∮┿玻或者,從另一個角度來說皆的,這意味著internal的任何包都不能通過項(xiàng)目外部的代碼導(dǎo)入覆履。這是有用的,因?yàn)樗梢苑乐蛊渌a庫導(dǎo)入和依賴我們internal目錄中的(可能未版本化和不支持的)包——即使項(xiàng)目代碼在GitHub中公開可用费薄。

hello world

在繼續(xù)下一步之前硝全,我們快速檢查下所有設(shè)置是否正確。用文本編輯器打開cmd/api/main.go文件楞抡,添加以下代碼:

package main

import "fmt"

func main() { fmt.Println("Hello world!")
}

保存文件伟众,并在終端中使用go run命令編譯和執(zhí)行cmd/api包中的代碼。如果一切正常召廷,您將看到以下輸出:

$ go run ./cmd/api
Hello world!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凳厢,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子柱恤,更是在濱河造成了極大的恐慌数初,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梗顺,死亡現(xiàn)場離奇詭異泡孩,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)寺谤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門仑鸥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吮播,“玉大人,你說我怎么就攤上這事眼俊∫夂荩” “怎么了?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵疮胖,是天一觀的道長环戈。 經(jīng)常有香客問我,道長澎灸,這世上最難降的妖魔是什么院塞? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮性昭,結(jié)果婚禮上拦止,老公的妹妹穿的比我還像新娘。我一直安慰自己糜颠,他們只是感情好汹族,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著其兴,像睡著了一般顶瞒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上元旬,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天搁拙,我揣著相機(jī)與錄音,去河邊找鬼法绵。 笑死,一個胖子當(dāng)著我的面吹牛酪碘,可吹牛的內(nèi)容都是我干的朋譬。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼兴垦,長吁一口氣:“原來是場噩夢啊……” “哼徙赢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起探越,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤狡赐,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后钦幔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枕屉,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年鲤氢,在試婚紗的時候發(fā)現(xiàn)自己被綠了搀擂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片西潘。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖哨颂,靈堂內(nèi)的尸體忽然破棺而出喷市,到底是詐尸還是另有隱情,我是刑警寧澤威恼,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布品姓,位于F島的核電站,受9級特大地震影響箫措,放射性物質(zhì)發(fā)生泄漏腹备。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一蒂破、第九天 我趴在偏房一處隱蔽的房頂上張望馏谨。 院中可真熱鬧,春花似錦附迷、人聲如沸惧互。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喊儡。三九已至,卻和暖如春稻据,著一層夾襖步出監(jiān)牢的瞬間艾猜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工捻悯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留匆赃,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓今缚,卻偏偏與公主長得像算柳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子姓言,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容