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

開始

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

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

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

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

 $ mkdir -p $HOME/Projects/greenlight

然后切換到這個目錄,使用go mod init命令為項目啟用模塊。

運行此命令時,您需要指定模塊路徑,這實際上是項目的唯一標(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

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

File: go.mod

module greenlight.alexedwards.net

go 1.16

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

  • 當(dāng)在你項目的根路徑下面有一個合法的go.mod文件的話,說明你的項目是一個模塊。
  • 當(dāng)你在項目中工作時,使用go get去下載依賴包,然后對應(yīng)特定版本的依賴包將在go.mod中記錄。因為版本是確定的,所以很容易在其他的機(jī)器或環(huán)境中執(zhí)行代碼。
  • 當(dāng)你在項目中運行或構(gòu)建代碼,Go將使用go.mod中記錄的特定依賴。如果需要的依賴并不在當(dāng)前機(jī)器中,Go將自動為你下載,以及任何遞歸依賴。
  • go.mod文件還定義了模塊路徑(就是前面說的greenlight.alexedwards.net)。這將用作項目中包導(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)建項目結(jié)構(gòu):

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

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

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

我們花點時間來討論這些文件和文件夾,并解釋它們在項目中所起的作用。

  • bin目錄包含應(yīng)用編譯后的二進(jìn)制文件,可直接部署到生成環(huán)境中。
  • cmd/api目錄包含Greenlight項目的API代碼文件。包括運行HTTP服務(wù)器、讀寫HTTP請求以及認(rèn)證管理等代碼。
  • internal目錄包含API使用的各種輔助包。包括與數(shù)據(jù)庫交互、數(shù)據(jù)校驗、發(fā)送郵件等?;旧先魏畏菓?yīng)用特定但可復(fù)用的代碼都放在這里。在cmd/api中的代碼會導(dǎo)入internal目錄的代碼(但從來沒有反過來導(dǎo)入的)
  • imgrations目錄包含數(shù)據(jù)庫SQL遷移文件。
  • remote目錄包含配制文件和設(shè)置腳本。
  • go.mod文件申明項目依賴,版本和module路徑。
  • Makefile文件包含常見自動執(zhí)行管理任務(wù)的方法,例如:代碼審計、構(gòu)建二進(jìn)制文件和執(zhí)行數(shù)據(jù)庫遷移。

要重點指出的是internal目錄在Go中有特殊的含義:在這個目錄中的任何包,只能被該目錄的父目錄導(dǎo)入使用。在我們的項目中,這意味著internal中的所有包只能被greenlight項目中代碼所引用?;蛘?,從另一個角度來說,這意味著internal的任何包都不能通過項目外部的代碼導(dǎo)入。這是有用的,因為它可以防止其他代碼庫導(dǎo)入和依賴我們internal目錄中的(可能未版本化和不支持的)包——即使項目代碼在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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容