iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 8
1

有了昨天的go程式經驗後,我覺得比起講觀念,還是直接寫程式比較好玩。今天我們來試著用go寫簡單的伺服器,先來看看程式碼:

package main

import (
	"fmt"
	"log"
	"net/http"
)

func main() {
	http.HandleFunc("/", handler) // each request calls handler
	log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

// handler echoes the Path component of the request URL r.
func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}

我們可以看到除了基礎的fmt以外,我們還用了lognet/http這兩個內建的函數包,透過這些方便的外掛,我們可以快速地實現商業邏輯與功能。順帶一提,這些函數包在用到的時候會自動加入,沒用到的時候(例如暫時註解掉)會自動刪除,go的精神相當討厭無用的東西(我是說在座的各位...XD),所以像是變數與外掛包,只要沒用到都需要刪掉!比方說如果把log那行註解掉,import內的log也會自動消失,可以試著操作看看。

第一行是扮演類似路由的角色,決定根目錄會呼叫handler這個方法,在這邊類似controller。hander則在這邊負責處理瀏覽器打來的request。第二行做了兩件事,第一件事是監聽本地的8000 port,也可以試著改成其他沒用到的port;第二就是寫下log。所以基本上把log移除,程式也能正常運作:

func main() {
	http.HandleFunc("/", handler) // each request calls handler
    http.ListenAndServe("localhost:8123", nil)
}

假設修正為上面這樣,我們試著用命令行啟動伺服器:

$ go run server.go &
[1] 28990

在後面加上&是結束等候程式回應,回傳的數字是os環境的PID。假如你剛剛選8123 port,你就可以試著在瀏覽器訪問http://localhost:8123/,並且試著在後面加上不同數字,網頁上會回傳你輸入的結果。

我個人建議是不要加上&讓程式等待,這樣如果要重啟只需要輸入command + c就可以了,每次執行都會增加一台server,不知道到底有沒有成功更新,要關閉伺服器有點不便。

有了剛剛的基礎,我們改寫一下程式,增加一個計數器,每次訪問這個網址就會加一:

package main

import (
	"fmt"
	"log"
	"net/http"
)

var count int

func main() {
	http.HandleFunc("/", handler) // each request calls handler
	http.HandleFunc("/count", counter)
	log.Fatal(http.ListenAndServe("localhost:8123", nil))
}

// handler echoes the Path component of the request URL r.
func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}

func counter(w http.ResponseWriter, r *http.Request) {
	count += 1
	fmt.Fprintf(w, "Count %d\n", count)
}

我們可以觀察main裡面現在有兩條路由,如果符合/count就會進入計數器counter,其他則是成為參數進入handler。在這樣的結構下,即使我們訪問http://localhost:8000/counter/123,也會導引至hander而印出URL.Path = "/counter/123",想要路由後面可以接自己的參數,必須在結尾加上/,例如把該行改寫為http.HandleFunc("/count/", counter)

把伺服器重啟,現在每次訪問http://localhost:8000/count/都會加1,可以試著不斷重新整理,數字會一直增加。

一樣今天的程式碼也放上github,有需要可以自行取用!

Reference


上一篇
命令行參數
下一篇
Html & Template
系列文
啥物碗Golang? 30天就Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
noway
iT邦研究生 1 級 ‧ 2020-07-05 21:50:38

您好:請問 這樣如果要重啟只需要輸入command + c就可以
是指?
我目前用 VS開發,啟動後不能打 command +c
只能用ctrl +C 關掉
謝謝

我要留言

立即登入留言