最近 在看go 的相關學習教程,鞏固一些知識點。
主要 程式碼 來自 《G01 Go 實戰:Web 入門》 學習中的程式碼
- 安裝 godoc
go get golang.org/x/tools/cmd/godoc
- 執行 godoc -http=:6060
- 訪問 本地 localhost:6060
- 安裝 air
go get -u github.com/cosmtrek/air
- 執行 air
air
- 之後更改程式碼會自動更新重啟
書接上文 增加一個 文章詳情 路由
router.HandleFunc("/articles/{id:[0-9]+}", articlesShowHandler).Methods("GET").Name("articles.show")
修改 articlesShowHandler 方法
func articlesShowHandler(w http.ResponseWriter, r *http.Request) {
// 1 獲取 url 引數
id := getRouteVariable("id", r)
// 2 讀取資料
article, err := getArticleByID(id)
// 3 判斷錯誤
if err != nil {
if err == sql.ErrNoRows {
// 3.1 未找到
w.WriteHeader(http.StatusNotFound)
fmt.Fprint(w, "404 文章未找到")
} else {
// 3.2 資料庫錯誤
checkError(err)
w.WriteHeader(http.StatusInternalServerError)
fmt.Fprint(w, "500 伺服器內部錯誤")
}
} else {
// 4. 讀取成功,顯示文章
tmpl, err := template.New("show.gohtml").
Funcs(template.FuncMap{
"RouteName2URL": RouteName2URL,
"Int64ToString": Int64ToString,
}).
ParseFiles("resources/views/articles/show.gohtml")
checkError(err)
tmpl.Execute(w, article)
}
}
func checkError(err error) {
if err != nil {
log.Fatal(err)
}
}
getRouteVariable 是公共獲取request 引數方法
func getRouteVariable(parameterName string, r *http.Request) string {
vars := mux.Vars(r)
return vars[parameterName]
}
關於模板的呼叫,用new發起時可以加額外的引數如使用Funcs方法將一些自定義的方法帶到模板中。也可以直接用ParseFiles呼叫 模板
tmpl, err := template.New("show.gohtml").
Funcs(template.FuncMap{
"RouteName2URL": RouteName2URL,
"Int64ToString": Int64ToString,
}).
ParseFiles("resources/views/articles/show.gohtml")
tmpl, err := template.ParseFiles("resources/views/articles/show.gohtml")
模板程式碼
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ .Title }} —— 我的技術部落格</title>
<style type="text/css">
.error {
color: red;
}
</style>
</head>
<body>
<p>ID: {{ .ID }}</p>
<p>標題: {{ .Title }}</p>
<p>內容:{{ .Body }}</p>
{{/* 構建刪除按鈕 */}}
{{ $idString := Int64ToString .ID }}
<form action="{{ RouteName2URL "articles.delete" "id" $idString }}" method="post">
<button type="submit" onclick="return confirm('刪除動作不可逆,請確定是否繼續')">刪除</button>
</form>
</body>
</html>
本作品採用《CC 協議》,轉載必須註明作者和本文連結