如果直接用 {{.}} 不加字段名的话,就是输出结构体打印的效果。
输出到浏览器里
要输出到浏览器里,只需要在 t.Execute(os.Stdout, p) 里,把原本输出到终端换成输出到处理函数的 w http.ResponseWriter 类型,就好了。
html模板的内容不变,下面是go的代码:
package main
import (
"fmt"
"net/http"
"text/template"
)
func Hello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World")
}
type Person struct {
Name string
Age int
}
func Index(w http.ResponseWriter, r *http.Request) {
p := Person{"Cara", 18}
t, err := template.ParseFiles("index.html")
if err != nil {
fmt.Println("加载模板ERROR:", err)
return
}
t.Execute(w, p)
}
func main() {
http.HandleFunc("/", Hello)
http.HandleFunc("/index", Index)
err := http.ListenAndServe("0.0.0.0:8000", nil)
if err != nil {
fmt.Println("http Listen failed")
}
}
判断
用法示例:
<body>
{{if gt .Age 18}}
<p>已成年</p>
{{else}}
<p>未成年</p>
{{end}}
</body>
更多判断逻辑:
not 非
{{if not .condition}}
{{end}}
and 与
{{if and .condition1 .condition2}}
{{end}}
or 或
{{if or .condition1 .condition2}}
{{end}}
eq 等于
{{if eq .var1 .var2}}
{{end}}
ne 不等于
{{if ne .var1 .var2}}
{{end}}
lt 小于
{{if lt .var1 .var2}}
{{end}}
le 小于等于
{{if le .var1 .var2}}
{{end}}
gt 大于
{{if gt .var1 .var2}}
{{end}}
ge 大于等于
{{if ge .var1 .var2}}
{{end}}
with 封装
with语句就是创建一个封闭的作用域,在其范围内,{{.}}代表with的变量,而与外面的{{.}}无关,只与with的参数有关:
<body>
{{with .Name}}
<p>{{.}}</p>
{{end}}
</body>
上面这样包在 {{with .Var}} 里,with 里的 {{.}} 代表的就是 Var 这个变量。
with 可以封装常数:
{{ with "world"}}
Now the dot is set to {{ . }}
{{ end }}
循环(遍历)
golang的template支持range循环来遍历map、slice内的内容,在range循环内,还可以使用$设置循环变量,我们可以通过 $i $v 来访问遍历的值。语法为:
{{range $i, $v := .slice}}
<li>key: {{ $key }}, value: {{ $value }}</li>
{{end}}
这是另外一种遍历方式,这种方式无法访问到index或者key的值,需要通过点来访问对应的value:
{{range .slice}}
{{.field}}
{{end}}
在循环内,点是代表遍历的值。原本使用点来访问的变量,那么在循环内部就要用 $. 来访问。下面的例子表示循环内和循环外 ArticleConten 这个变量访问的方式:









