一. 向模版传递数据

  • 可以在HTML中使用{{}}获取template.Execute()第二个参数传递的值
  • 最常用的{{.}}中的”.”是指针,指向当前变量,称为”dot”
  • 在{{}}可以有的Argument,官方给定如下
  1. - go语法的布尔值、字符串、字符、整数、浮点数、虚数、复数,视为无类型字面常数,字符串不能跨行
  2. - 关键字nil,代表一个go的无类型的nil
  3. - 字符'.'(句点,用时不加单引号),代表dot的值
  4. - 变量名,以美元符号起始加上(可为空的)字母和数字构成的字符串,如:$piOver2$
  5. 执行结果为变量的值,变量参见下面的介绍
  6. - 结构体数据的字段名,以句点起始,如:.Field
  7. 执行结果为字段的值,支持链式调用:.Field1.Field2
  8. 字段也可以在变量上使用(包括链式调用):$x.Field1.Field2
  9. - 字典类型数据的键名;以句点起始,如:.Key
  10. 执行结果是该键在字典中对应的成员元素的值;
  11. 键也可以和字段配合做链式调用,深度不限:.Field1.Key1.Field2.Key2
  12. 虽然键也必须是字母和数字构成的标识字符串,但不需要以大写字母起始;
  13. 键也可以用于变量(包括链式调用):$x.key1.key2
  14. - 数据的无参数方法名,以句点为起始,如:.Method
  15. 执行结果为dot调用该方法的返回值,dot.Method();
  16. 该方法必须有12个返回值,如果有2个则后一个必须是error接口类型;
  17. 如果有2个返回值的方法返回的errornil,模板执行会中断并返回给调用模板执行者该错误;
  18. 方法可和字段、键配合做链式调用,深度不限:.Field1.Key1.Method1.Field2.Key2.Method2
  19. 方法也可以在变量上使用(包括链式调用):$x.Method1.Field
  20. - 无参数的函数名,如:fun
  21. 执行结果是调用该函数的返回值fun();对返回值的要求和方法一样;函数和函数名细节参见后面。
  22. - 上面某一条的实例加上括弧(用于分组)
  23. 执行结果可以访问其字段或者键对应的值:
  24. print (.F1 arg1) (.F2 arg2)
  25. (.StructValuedMethod "arg").Field
  • 向HTML传递字符串数据.在HTML中使用{{.}}获取传递数据即可.所有基本类型都是使用此方式进行传递
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  2. "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <pre>
  9. 尊敬的{{.}}先生/女士
  10. 您已经被我公司录取,收到此消息后请您仔细阅读附件中"注意事项"
  11. 再次祝您:{{.}}好运
  12. </pre>
  13. </body>
  14. </html>
  1. package main
  2. import (
  3. "net/http"
  4. "html/template"
  5. )
  6. func welcome(w http.ResponseWriter, r *http.Request) {
  7. t, _ := template.ParseFiles("view/index.html")
  8. t.Execute(w, "smallming") //此处传递数据
  9. }
  10. func main() {
  11. server := http.Server{Addr: ":8090"}
  12. http.HandleFunc("/", welcome)
  13. server.ListenAndServe()
  14. }

二. 传递结构体类型数据

  • 结构体的属性首字母必须大写才能被模版访问
  • 在模版中直接使用{{.属性名}}获取结构体的属性
  • HTML代码如下
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  2. "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <pre>
  9. 当前登录用户信息:<br/>
  10. 姓名:{{.Name}}<br/>
  11. 年龄:{{.Age}}
  12. </pre>
  13. </body>
  14. </html>
  • go文件代码如下
  1. package main
  2. import (
  3. "net/http"
  4. "html/template"
  5. )
  6. //注意:只有首字母大写的属性才能在模版中访问到
  7. type User struct {
  8. Name string
  9. Age int
  10. }
  11. func welcome(w http.ResponseWriter, r *http.Request) {
  12. t, _ := template.ParseFiles("view/index.html")
  13. t.Execute(w, User{"张三", 20}) //此处传递数据
  14. }
  15. func main() {
  16. server := http.Server{Addr: ":8090"}
  17. http.HandleFunc("/", welcome)
  18. server.ListenAndServe()
  19. }

三.向模版传递map类型数据

  • 直接使用{{.key}}获取map中数据
  • 模版中支持连缀写法(不仅仅是map)
  • go文件代码如下
  1. package main
  2. import (
  3. "net/http"
  4. "html/template"
  5. )
  6. //注意:只有首字母大写的属性才能在模版中访问到
  7. type User struct {
  8. Name string
  9. Age int
  10. }
  11. func welcome(w http.ResponseWriter, r *http.Request) {
  12. t, _ := template.ParseFiles("view/index.html")
  13. m := make(map[string]interface{})
  14. m["user"] = User{"张三", 20}
  15. m["money"] = 998
  16. t.Execute(w, m) //此处传递数据
  17. }
  18. func main() {
  19. server := http.Server{Addr: ":8090"}
  20. http.HandleFunc("/", welcome)
  21. server.ListenAndServe()
  22. }
  • HTML代码如下,里面使用了连缀写法
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
  2. "http://www.w3.org/TR/html4/loose.dtd">
  3. <html>
  4. <head>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <pre>
  9. 当前登录用户信息:<br/>
  10. 姓名:{{.user.Name}}<br/>
  11. 年龄:{{.user.Age}}<br/>
  12. 购物金额:{{.money}}
  13. </pre>
  14. </body>
  15. </html>