有了昨天的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
以外,我們還用了log
與net/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,有需要可以自行取用!
您好:請問 這樣如果要重啟只需要輸入command + c就可以
是指?
我目前用 VS開發,啟動後不能打 command +c
只能用ctrl +C 關掉
謝謝