go學習鞏固知識點(2)開啟go 的本地文件 開發程式碼更新啟動 模板使用

lai發表於2021-04-11

最近 在看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 協議》,轉載必須註明作者和本文連結

相關文章