初探 Golang

May 26, 2020

根據 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"}做為回傳值。

延伸閱讀

https://www.ithome.com.tw/voice/107839



Written by Howard Chang , software engineer, programming lover, from Taiwan