# Day20 Golang 網頁框架 gin 琴酒介紹 今天開始要用到別人的程式了, 別人的程式就是比較讚。 --- Go語言在github上有許多的網頁框架: * [**gin-gonic**](https://github.com/gin-gonic/gin) * [beego](https://github.com/astaxie/beego) * [iris](https://github.com/kataras/iris) * [echo](https://github.com/labstack/echo) * [revel](https://github.com/revel/revel) 每個有各自的效能評比, 今天就來介紹主流的網頁框架gin。 ![Gin](https://i.imgur.com/H1ZUKzR.png) ~~這是gin? 我看著倒像檸檬海水~~ ## 安裝gin golang安裝套件方法分成很多種,以下介紹其中兩種 #### go get 全域安裝 透過`go get`指令來安裝到`GOPATH`底下,讓所有的專案都可以用gin套件。 $ go get -u github.com/gin-gonic/gin #### glide 區域安裝 透過昨天提到的glide工具來下載`vendor`資料夾到專案底下,只有該專案能使用gin套件。 在`GOPATH(go/src)`中,在專案底下 創建glide.yaml檔案 ```yaml package: . import: - package: github.com/gin-gonic/gin version: ~1.3.0 ``` 在專案底下 放gin1.go程式 ```go package main import ( "github.com/gin-gonic/gin" ) func main() { } ``` 接著在專案底下執行glide命令 $ glide install --- ## 使用gin ```go package main import ( "github.com/gin-gonic/gin" "net/http" ) func main() { router := gin.Default() router.GET("/test", test) router.Run(":80") } func test(c *gin.Context) { str := []byte("ok") // 對於[]byte感到疑惑嗎? 因為網頁傳輸沒有string的概念,都是要轉成byte字節方式進行傳輸 c.Data(http.StatusOK, "text/plain", str) // 指定contentType為 text/plain,就是傳輸格式為純文字啦~ } ``` 先確定`80 port`沒有被任何程式佔據,否則會出現 `listen tcp :80: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.` 的錯誤。 執行程式後,用瀏覽器打開`127.0.0.1/test`(本地主機localhost),成功的話能看到以下畫面 ![OK](https://i.imgur.com/ntAlDg4.png) 回頭看看程式端,方便的地方在於可以: * 快速看出Client端的IP * 訪問了Server的哪個位置(URI) ![方便](https://i.imgur.com/nYjfyYj.png) 由於是開啟`/test`這個URI,如果Client端訪問根目錄`/`的話會出現`404 page not found` ![根目錄](https://i.imgur.com/C9JYaqX.png) --- ## 什麼是網頁框架呢? 就是集大成,讓程式設計師能更快速方便開發網站的一套工具。 其實我們也可以用golang內建原生的函式來達成剛剛的範例的輸出。 ```go package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/test", test) http.ListenAndServe(":80", nil) // 傾聽 TCP 80 port及 處理服務 } func test(writer http.ResponseWriter, request *http.Request) { // 把字串寫回writer str := []byte("ok") writer.Write(str) // 或者直接用以下這行 fmt.Fprintf(writer, "ok") } ``` Golang很好用拔!我們透過`net/http`官方的套件 以TCP/IP方法來傾聽80 port, 一樣可以跑、得到一樣的結果,而且不用安裝gin套件。 但就沒有那麼方便的儀板表可以來看Client訪問端的資料了。 > 目前這個小小程式,還感受不到網頁框架的威力。 > 敬請期待明天的gin