Go语言中http和mysql的实现代码

2020-01-28 13:43:47刘景俊

如果直接用 {{.}} 不加字段名的话,就是输出结构体打印的效果。

输出到浏览器里

要输出到浏览器里,只需要在 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 这个变量访问的方式: