读取表单数据
r.ParseForm() 由 http 包提供,从请求中解析请求参数,必须是执行完这段代码,后面 r.PostForm 和 r.Form 才能读取到数据,否则为空数组。
func articlesStoreHandler(w http.ResponseWriter, r *http.Request) {
if err := r.ParseForm(); err != nil {
fmt.Fprint(w, "请提供正确的数据!")
return
}
...代码省略...
}
POST:
// 一次性获取POST提交的全部参数,并从map当中获取某一个参数
title := r.PostForm["title"]
// or
// 还支持ADD DEL SET等操作
data := r.PostForm.Get("data")
GET:
// 一次性获取GET提交的全部参数,并从map当中获取某一个参数
title := r.Form["title"]
// or
// 还支持ADD DEL SET等操作
data := r.Form.Get("data")
如不想获取所有的请求内容,而是逐个获取的话,这也是比较常见的操作,无需使用 r.ParseForm() 可直接使用 r.FormValue() 和 r.PostFormValue() 方法:
r.PostFormValue("title") // POST
r.FormValue("title") // GET
模板
读取模板并载入
// 获取store页面的链接
storeURL, _ := router.Get("articles.store").URL()
data := ArticlesFormData{
Title: "",
Body: "",
URL: storeURL,
Errors: nil,
}
tmpl, err := template.ParseFiles("resources/views/articles/create.gohtml")
if err != nil {
panic(err)
}
tmpl.Execute(w, data)
常见的模板语法
界定符
双层大括号{{ }}为默认的模板界定符,用于在 HTML 模板文件中界定模板语法,模板的语法都包含在 {{ 和 }} 的中间。
{{.}}语句
{{ . }} 中的点表示当前对象。当我们传入一个结构体对象时,我们可以使用 . 来访问结构体的对应字段。同理,当我们传入的变量是 map 时,也可以在模板文件中通过 . 根据 key 来取值。例如:
<form action="{{ .URL }}" method="post">
with 关键字
// 如果 pipeline 为空则不产生输出,否则将 . 设为 pipeline 的值并执行 T1。不修改外面的 . 。
{{ with pipeline }} T1 {{ end }}
// 如果 pipeline 为空则不改变 . 并执行 T0,否则 . 设为 pipeline 的值并执行 T1。
{{ with pipeline }} T1 {{ end }}
with 区块外,{{ . }} 代表传入模板的数据,而在 with 区块内,则代表 pipline 里的数据。
pipeline
pipeline 是指产生数据的操作。比如 {{ . }}、{{ .Name }} 等。Go 的模板语法支持使用管道符号 | 连接多个命令,用法和 Unix 下的管道类似 —— | 前面的命令会将运算结果 (或返回值) 传递给后一个命令的最后一个位置。
注意:并不是只有使用了 | 才是 pipeline。Go 的模板中,pipeline 的概念是传递数据,只要能产生数据的,都是 pipeline。
变量
我们可以在模板中声明变量,用来保存传入模板的数据或其他语句生成的结果。具体语法如下:
$variable := {{ . }}
其中 $variable 是变量的名字,在后续的代码中就可以使用该变量了。
移除空格
有时会不可避免的引入空格或者换行符,导致模板最终渲染结果不符预期。这种情况可以使用 {{- 语法去除模板内容左侧的所有空白符号, 使用 -}} 去除模板内容右侧的所有空白符号。
例如:
{{- .Name -}}
注意:- 要紧挨 {{和}},同时与模板值之间需要使用空格分隔。
条件判断
Go 模板语法的条件判断有以下几种:
{{if pipeline}} T1 {{end}}
{{if pipeline}} T1 {{else}} T0 {{end}}
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}}
range遍历
range 关键字用以在模板里遍历数据,有以下两种写法,其中 pipeline 的值必须是数组、切片、字典或者通道。
语法如下:
// 如果 pipeline 的值其长度为 0,不会有任何输出。
{{range pipeline}} T1 {{end}}
// 如果 pipeline 的值其长度为 0,则会执行 T0。
{{range pipeline}} T1 {{else}} T0 {{end}}
执行函数(或方法)
假设想在模板里执行下面这个函数 (或者 方法),总共有两种写法:
// Int64ToString 将 int64 转换为 string.
func Int64ToString(num int64) string {
return strconv.FormatInt(num, 10)
}
第一种:(注意:.Int64ToString是函数名 .ID是参数)
// main.go:
tmpl, err := template.ParseFiles("resources/views/articles/show.gohtml")
if err != nil {
log.Fatal(err)
}
tmpl.Execute(w, article)
// show.gohtml:
{{ $idString := .Int64ToString .ID }}
第二种:注意:Int64ToString是函数名 .ID是参数)
// main.go:
tmpl, err := template.New("show.gohtml").Funcs(template.FuncMap{
"RouteName2URL": RouteName2URL,
"Int64ToString": Int64ToString,
}).ParseFiles("resources/views/articles/show.gohtml")
if err != nil {
log.Fatal(err)
}
tmpl.Execute(w, article)
// show.gohtml:
{{ $idString := Int64ToString .ID }}
评论前必须登录!
注册