---
# System prepended metadata

title: Day20 Golang 網頁框架 gin 琴酒介紹

---

# 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