根據 wiki,
Go是Google開發的一種靜態強型別、編譯型、並發型,並具有垃圾回收功能的程式語言。
現在在雲服務中,很多人在使用golang來實作服務。因此,想試試看 寫 golang是什麼感覺,
因此,隨便上網找了一個 starter turtoril 來 step by step 照著做,並且記錄一下。
以下的內容參考、翻譯自 https://dev.to/moficodes/build-your-first-rest-api-with-go-2gcj
Go 中的 Rest Api
寫restful api,為什麼要選擇 go ?
- go 是 compile 語言,所以編譯後會得到一個很小的執行檔。
- 快速(比c慢一點,但比大多數的web語言快
- 非常簡單易懂。
- 它非常適合應用在微服務的使用場景
net/http
net/http 為go 的 standard library。它是撰寫restful api 非常好的起始點。
幾乎所有其它的library都可以與它交互操作。所以理解它是很重要的。
現在不必了解它所有的細節,只要知道一些我們該知道的事,就可以開始coding了!
The Handler Interface
下面是 Handler 的介面。所有的 net/http 程式都應該要實現此介面。
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}這個介面只有唯一的一個方法。
一個結構,只要有一個 ServeHTTP 方法,接受 ResponseWriter及 *request,就可以被當作一個handler介面使用。
source code
package main
import (
"log"
"net/http"
)
type server struct {}
func (s *server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
// 這個用法應該是指定型態↓
w.Write([]byte(`{"message": "hello, world"}`))
}
func main() {
s := &server{}
http.Handle("/", s)
log.Fatal(http.ListenAndServe(":8888", nil))
} 逐行解析
所有的可執行go程式,都必須包含一個main package。
當錯誤發生時,我們可以使用log來查看發生了什麼事情。
因為我們要寫 restful api,所以我們必須載入 net/http這個套件。
接下來,我們必須要開始設計我們的伺服器。現在伺服器中沒有任何東西,我們建立一個方法ServeHTTP,它會滿足我們的 Handler 介面。
在go當中,我們不須要明確的指明我們實現了哪個介面。編譯器可以自動偵測我們實現的介面。
在ServeHTTP中,我們設定 httpStatus 200,表示請求成功。並且設定我們回傳的資料型>態為 application/json,好讓 client端知道我們的回傳型態是json檔。
最後,我們將 {"message": "hello world"}做為回傳值。