摒弃世俗浮躁
追求技术精湛

Golang笔记(三):表单和模板

读取表单数据

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 }}
赞(1) 打赏
未经允许不得转载:时光日记 » Golang笔记(三):表单和模板

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏