golang 模板(test/template)

转载自:http://blog.csdn.net/u010165367/article/details/51530885

模板就是将一组文本嵌入另一组文本里

1. 传入string–最简单的替换

package main
import (
    "os"
    "text/template"
)
func main() {
    name := "happy"
    tmpl, err := template.New("test").Parse("hello, {{.}}") //建立一个模板,内容是"hello, {{.}}"

    err = tmpl.Execute(os.Stdout, name)  //将string与模板合成,变量name的内容会替换掉{{.}} 
    //合成结果放到os.Stdout里
}

//输出 : hello,happy

2. 传入struct

模板合成那句,第2个参数是interface{},所以可以传入任何类型,现在传入struct看看 要取得struct的值,只要使用成员名字即可,看代码吧:

package main
import (
    "os"
    "text/template"
)

type Inventory struct {
    Material string
    Count    uint
}

func main() {
    sweaters := Inventory{"wool", 17} 
    muban := "{{.Count}} items are made of {{.Material}}"
    tmpl, err := template.New("test").Parse(muban)  //建立一个模板
    if err != nil {   
            panic(err)
    }   
    err = tmpl.Execute(os.Stdout, sweaters) //将struct与模板合成,合成结果放到os.Stdout里
    if err != nil {
            panic(err)
    }   
}

//输出 : 17 items are made of wool

3. 多模板,介绍New,Name,Lookup

//一个模板可以有多种,以Name来区分

muban_eng := "{{.Count}} items are made of {{.Material}}"
muban_chn := "{{.Material}}做了{{.Count}}个项目"

//建立一个模板的名称是china,模板的内容是muban_chn字符串

tmpl, err := template.New("china")
tmpl, err = tmpl.Parse(muban_chn)

//建立一个模板的名称是english,模板的内容是muban_eng字符串

tmpl, err = tmpl.New("english")
tmpl, err = tmpl.Parse(muban_eng)

//将struct与模板合成,用名字是china的模板进行合成,结果放到os.Stdout里,内容为“wool做了17个项目”

err = tmpl.ExecuteTemplate(os.Stdout, "china", sweaters)

//将struct与模板合成,用名字是china的模板进行合成,结果放到os.Stdout里,内容为“17 items are made of wool”

err = tmpl.ExecuteTemplate(os.Stdout, "english", sweaters)
tmpl, err = template.New("english")
fmt.Println(tmpl.Name())  //打印出english
tmpl, err = tmpl.New("china")
fmt.Println(tmpl.Name())  //打印出china
tmpl=tmpl.Lookup("english")//必须要有返回,否则不生效
fmt.Println(tmpl.Name())  //打印出english

4. 文件模板,介绍ParseFiles

//模板可以是一行

muban := "{{.Count}} items are made of {{.Material}}"

//也可以是多行

muban := `items number is {{.Count}}
there made of {{.Material}}
`

把模板的内容发在一个文本文件里,用的时候将文本文件里的所有内容赋值给muban这个变量即可
上面的想法可以自己实现,但其实tamplate包已经帮我们封装好了,那就是template.ParseFiles方法

假设有一个文件mb.txt的内容是muban变量的内容
$cat mb.txt
{{.Count}} items are made of {{.Material}}

那么下面2行

muban := "{{.Count}} items are made of {{.Material}}"
tmpl, err := template.New("test").Parse(muban)  //建立一个模板

等价于

tmpl, err := template.ParseFiles("mb.txt")  //建立一个模板,这里不需要new("name")的方式,因为name自动为文件名

5.文件模板,介绍ParseGlob

ParseFiles接受一个字符串,字符串的内容是一个模板文件的路径(绝对路径or相对路径)
ParseGlob也差不多,是用正则的方式匹配多个文件

假设一个目录里有a.txt b.txt c.txt的话
用ParseFiles需要写3行对应3个文件,如果有一万个文件呢?
而用ParseGlob只要写成template.ParseGlob(“*.txt”) 即可

模板的输出,介绍ExecuteTemplate和Execute

模板下有多套模板,其中有一套模板是当前模板
可以使用Name的方式查看当前模板

err = tmpl.ExecuteTemplate(os.Stdout, "english", sweaters)  //指定模板名,这次为english
err = tmpl.Execute(os.Stdout, sweaters)  //模板名省略,打印的是当前模板

6.模板的复用

模板里可以套模板,以达到复用目的,用template关键字

muban1 := `hi, {{template "M2"}},
hi, {{template "M3"}}
`
muban2 := "我是模板2,{{template "M3"}}"
muban3 := "ha我是模板3ha!"

tmpl, err := template.New("M1").Parse(muban1)
tmpl.New("M2").Parse(muban2)
tmpl.New("M3").Parse(muban3)
err = tmpl.Execute(os.Stdout, nil)

完整代码:

package main

import (
    "os"
    "text/template"
)

func main() {
    muban1 := `hi, {{template "M2"}},
hi, {{template "M3"}}
`
    muban2 := `我是模板2,{{template "M3"}}`
    muban3 := "ha我是模板3ha!"

    tmpl, err := template.New("M1").Parse(muban1)
    if err != nil {
            panic(err)
    }   
    tmpl.New("M2").Parse(muban2)
    if err != nil {
            panic(err)
    }   
    tmpl.New("M3").Parse(muban3)
    if err != nil {
            panic(err)
    }   
    err = tmpl.Execute(os.Stdout, nil)
    if err != nil {
            panic(err)
    }   
}

输出的内容

hi, 我是模板2,ha我是模板3ha!,
hi, ha我是模板3ha!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值