初识 template
template.ParseFiles(file)进行解析文件t.Execute(io.Writer, interface{})把数据渲染到html里面- 调用数据渲染
{{ }} {{ . }}里面的.代表你传入的数据(结构体,map)进行渲染{{ .Name }}是 取传入的数据中的Name的数值
传入的数据类型中的元素必须大写开头,否则访问不到该元素
main.go
package main
import (
"fmt"
"os"
"text/template"
)
type Persion struct {
Name string
Age int
}
func main() {
file := "h:/360_update/oldboy_go/src/go_dev/day10/exercises/http_template/index.html"
t, err := template.ParseFiles(file)
if err != nil {
fmt.Println("parse file err:", err)
return
}
p := Persion{
Name: "Conny",
Age: 18,
}
if err := t.Execute(os.Stdout, p); err != nil {
fmt.Println("There was an error:", err.Error())
}
}
index.html
<html>
<body>
<p>hello {{ .Name }}</p>
<p>Age: {{ .Age }}</p>
<p>{{ . }}</p>
</body>
</html>
编译并运行:
$ go build go_dev/day10/exercises/http_template
$ .\http_template.exe
<html>
<body>
<p>hello Conny</p>
<p>Age: 18</p>
<p>{Conny 18}</p>
</body>
</html>
http template 渲染
渲染-1(结构体 struct渲染)
package main
import (
"fmt"
"net/http"
"text/template"
)
type Persion struct {
Name string
Age int
Title string
}
var myTemplate *template.Template
func userInfo(writer http.ResponseWriter, request *http.Request) {
fmt.Println("user info...")
fmt.Fprintln(writer, "<h1>User info</h1>")
user := Persion{
Name: "Conny",
Age: 18,
Title: "Conny web server",
}
// 利用结构体渲染
myTemplate.Execute(writer, user)
}
func initTemplate(fileName string) (err error) {
myTemplate, err = template.ParseFiles(fileName)
if err == nil {
err = fmt.Errorf("parse file err:%v", err)
return
}
return
}
func main() {
initTemplate("H:/360_update/oldboy_go/src/go_dev/day10/exercises/6-http-template/index.html")
http.HandleFunc("/user/info", userInfo)
err := http.ListenAndServe("0.0.0.0:8000", nil)
if err != nil {
fmt.Println("server failed ...")
return
}
}
index.html
<html>
<head>
<title>{{ .Title }}</title>
</head>
<body>
<p>hello {{ .Name }}</p>
<p>Age: {{ .Age }}</p>
<p>Age: {{ . }}</p>
</body>
</html>
编译并运行
$ go build go_dev/day10/exercises/6-http-template
$ ./6-http-template
使用http client访问(使用浏览器访问更直观)
$ ./2-http-client
data: <h1>User info</h1>
<html>
<head>
<title>Conny web server</title>
</head>
<body>
<p>hello Conny</p>
<p>Age: 18</p>
<p>Age: {Conny 18 Conny web server}</p>
</body>
</html>
template 渲染 if判断
使用方法:
{{ if gt .Age 20 }}
<p> hello, old main {{ .Name }}</p>
{{ else }}
<p> hello, yong main {{ .Name }}</p>
{{ end }}
if对比操作符
- 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 小于(less than)
{{if lt .var1 .var2}} {{end}} - le 小于等于
{{if le .var1 .var2}} {{end}} - gt 大于
{{if gt .var1 .var2}} {{end}} - ge 大于等于
{{if ge .var1 .var2}} {{end}}
index.html
<html>
<head>
<title>{{ .Title }}</title>
</head>
<body>
<p>hello {{ .Name }}</p>
{{ if gt .Age 20 }}
<p> hello, old man {{ .Name }}</p>
{{ else }}
<p> hello, yong man {{ .Name }}</p>
{{ end }}
</body>
</html>
http 渲染-2 (map渲染)
with是在with代码块中 传入的元素变成.来操作range循环数组
package main
import (
"fmt"
"net/http"
"text/template"
)
var myTemplate *template.Template
func userInfo(writer http.ResponseWriter, request *http.Request) {
fmt.Println("user info...")
// 初始化一个map
user := make(map[string]interface{})
user["name"] = "Conny"
user["age"] = 18
user["title"] = "个人网站"
// 渲染到html中
myTemplate.Execute(writer, user)
}
func initTemplate(fileName string) (err error) {
myTemplate, err = template.ParseFiles(fileName)
if err == nil {
err = fmt.Errorf("parse file err:%v", err)
return
}
return
}
func main() {
initTemplate("H:/360_update/oldboy_go/src/go_dev/day10/exercises/6-http-template/index.html")
http.HandleFunc("/user/info", userInfo)
err := http.ListenAndServe("0.0.0.0:8000", nil)
if err != nil {
fmt.Println("server failed ...")
return
}
}
index.html
<html>
<head>
<title>{{ .title }}</title>
</head>
<body>
<p>hello {{ .name }}</p>
{{ if gt .age 20 }}
<p> hello, old man {{ .name }}</p>
{{ else }}
<p> hello, yong man {{ .name }}</p>
{{ end }}
<p>{{ . }}</p>
</body>
</html>
编译运行
$ go build go_dev/day10/exercises/6-http-template
$ .\6-http-template.exe
模板渲染 range with
package main
import (
"fmt"
"net/http"
"text/template"
)
type Persion struct {
Name string
Age int
Describe string
}
var myTemplate *template.Template
func userInfo(writer http.ResponseWriter, request *http.Request) {
fmt.Println("user info...")
user := make(map[string]interface{})
user["name"] = "Conny"
user["age"] = 18
user["title"] = "个人网站"
friendA := Persion{Name: "friendA", Age: 18, Describe: "friendA web"}
friendB := Persion{Name: "friendB", Age: 18, Describe: "friendB web"}
friendC := Persion{Name: "friendC", Age: 18, Describe: "friendC web"}
var friend []Persion
// 定义friend切片 append 所有的结构体到切片中
friend = append(friend, friendA, friendB, friendC)
// 设置user 的friend key 为friend的切片
user["friend"] = friend
myTemplate.Execute(writer, user)
}
func initTemplate(fileName string) (err error) {
myTemplate, err = template.ParseFiles(fileName)
if err == nil {
err = fmt.Errorf("parse file err:%v", err)
return
}
return
}
func main() {
initTemplate("H:/360_update/oldboy_go/src/go_dev/day10/exercises/6-http-template/index.html")
http.HandleFunc("/user/info", userInfo)
err := http.ListenAndServe("0.0.0.0:8000", nil)
if err != nil {
fmt.Println("server failed ...")
return
}
}
index.html
<html>
<head>
<title>{{ .title }}</title>
</head>
<body>
<p>hello {{ .name }}</p>
{{ if gt .age 20 }}
<p> hello, old main {{ .name }}</p>
{{ else }}
<p> hello, yong man {{ .name }}</p>
{{ end }}
<p> {{ .name }} 的朋友们:</p>
{{ with .friend}}
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>描述</td>
</tr>
{{ range . }}
<tr>
<td>{{ .Name }}</td>
<td>{{ .Age }}</td>
<td>{{ .Describe }}</td>
</tr>
{{ end }}
</table>
{{ end }}
<p>{{ . }}</p>
</body>
</html>
编译并运行
$ go build go_dev/day10/exercises/6-http-template
$ .\6-http-template.exe
浏览器访问结果:

详解: with 和 range 他们两个是相辅相成使用
摘抄一段渲染代码
{{ with .friend}}
<table border="1">
<tr>
<td>姓名</td>
<td>年龄</td>
<td>描述</td>
</tr>
{{ range . }}
<tr>
<td>{{ .Name }}</td>
<td>{{ .Age }}</td>
<td>{{ .Describe }}</td>
</tr>
{{ end }}
</table>
{{ end }}
代码中with .friend 把.friend这个数组变成.供后面的range使用,range .每一次循环一个结构体friend出来进行渲染。
本文介绍了Go语言中使用http和template包进行HTML模板渲染的方法,包括结构体struct渲染、if判断条件、map数据渲染以及range和with关键字的使用,通过实例代码详细展示了如何将数据与模板结合并呈现到网页上。

被折叠的 条评论
为什么被折叠?



