文档章节

go语言的模板,text/template包

waynehu
 waynehu
发布于 2013/08/16 16:13
字数 1494
阅读 12342
收藏 18
点赞 4
评论 1

#go语言的模板,text/template包 ##定义 模板就是将一组文本嵌入另一组文本里

##传入string--最简单的替换

package main

import (
    "os"
    "text/template"
)

func main() {
    name := "waynehu"
    tmpl, err := template.New("test").Parse("hello, {{.}}") //建立一个模板,内容是"hello, {{.}}"
    if err != nil {   
            panic(err)
    }   
    err = tmpl.Execute(os.Stdout, name)  //将string与模板合成,变量name的内容会替换掉{{.}} 
    //合成结果放到os.Stdout里
    if err != nil {
            panic(err)
    }   
}
//输出 :   hello, waynehu

因为"hello, {{.}}"也是一个字符串,所以可以单独拎出来,如下:

//这句
tmpl, err := template.New("test").Parse("hello, {{.}}")
//等于下面的两句
muban := "hello, {{.}}"
tmpl, err := template.New("test").Parse(muban)
//之后的例子都用两句的方式表达

##传入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

##多模板,介绍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

##文件模板,介绍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自动为文件名

##文件模板,介绍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)  //模板名省略,打印的是当前模板

##模板的复用 模板里可以套模板,以达到复用目的,用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!

##模板的回车 模板文件里的回车也是模板的一部分,如果对回车位置控制不好,合成出来的文章会走样 标准库里的Example(Template)写的还是有点乱,我整理如下:

const letter = `Dear {{.Name}},

{{if .Attended}}It was a pleasure to see you at the wedding.
如果Attended是true的话,这句是第二行{{else}}It is a shame you couldn't make it to the wedding.
如果Attended是false的话,这句是第二行{{end}}
{{with .Gift}}Thank you for the lovely {{.}}.
{{end}}
Best wishes,
Josie

`

解释一下:

  • Dear某某某的Dear应该是在第一行,所以在D前面不能有回车,否则Dear会跑到第2行去
    • 所以Dear要紧贴```
  • 信件的称唿和正文有一行空行,最好显式的打出一行,而标准库里的回车是包在if里,成为正文的一部分,这样排版容易出错
  • 正确的正文排版如下
    • 如果正文就一行,要把true和false的所有内容都写在一行
      • 比如{{if .Attended}}true line,hello true{{else}}false line,hi false{{end}}
    • 如果正文有多行,就等于把一行拆成多行
      • 会发现true的最后一行和false的第一行是在同一行
      • {{if .Attended}}和ture的第一行在同一行
      • {{end}}和false的最后一行在同一行

如下

{{if .Attended}}true line
hello true{{else}}false line
hi false{{end}}
  • 关于{{with .Gift}},意思是如果Gift不是为空的话,就打印整行,如果为空,就不打印
    • 只有这样写法,with对应的end要写在第2行,才会把“Thank you”这句后面带一个回车进去,这样写法,就像“Thank you”这句是插在正文下面的
    • 只有这样写,不管有没有“Thank you”,正文和Best wishes,之间始终只有1行空白

© 著作权归作者所有

共有 人打赏支持
waynehu
粉丝 33
博文 40
码字总数 25481
作品 0
静安
加载中

评论(1)

码农小骚年
码农小骚年
真的很好!解决了我的问题,作者写的很详细!
golang html/template

template包(html/template)实现了数据驱动的模板,用于生成可对抗代码注入的安全HTML输出。本包提供了和text/template包相同的接口,无论何时当输出是HTML的时候都应使用本包。 main.go te...

别人说我名字很长 ⋅ 2015/10/06 ⋅ 0

Live Writer首段缩进和全角空格设置

一、段首缩进   使用文本模板插件Text Template可以实现Live Writer写博文每段首行缩进的功能   1)安装文本插件Text Template   2)设置插件    插入->Text Template->Add new Temp...

StephenZou ⋅ 2013/07/14 ⋅ 0

Thymeleaf 3.0.0 正式发布,HTML 5 模板引擎

Thymeleaf 3.0.0 正式发布。主要更新内容: Template更新 删除任何 th:inline="text" 属性 配置更新 thymeleaf-spring4 集成包和Java配置显示Thymeleaf3结构 全部HTML5标记支持 Thymeleaf3.0...

淡漠悠然 ⋅ 2016/05/09 ⋅ 9

Tiny代码生成框架

概述: 我们经常会碰到这种情况,就是许多时候有些代码或配置都长得很像,或者说他们就好象一个模子里拓出来的一样,只是其中有一部分的内容不同而已。那么,如果我们能找得到其中的一些规律...

悠悠然然 ⋅ 2014/06/22 ⋅ 0

黄天政/codgen

1、什么是codgen? Codgen是一个基于数据库元数据模型,使用freemarker模板引擎来构建输出的代码生成器。freemarker的数据模型结构通常来说都是一个Map树状结构模型,codgen也不例外,它的数...

黄天政 ⋅ 2015/10/08 ⋅ 0

GO语言标准库概览

本文翻译自Dr.Dobb's的"A Brief Tour of the Go Standard Library"一文。 在Go语言五周系列教程的最后一部分中,我们将带领大家一起来浏览一下Go语言丰富的标准库。 Go标准库包含了大量包,提...

itfanr ⋅ 2014/03/26 ⋅ 0

XSLT语法 在.net中使用XSLT转换xml文档示例

XSL即可扩展的样式表文件。 可以格式化xml的显示,也可以将xml转换成需要的另一种格式。 学习XSL必须熟悉XPath。XSL和XPath一样简单强大,容易学习。 1. XSL既然可以格式化xml的显示样式,我...

长平狐 ⋅ 2012/06/08 ⋅ 0

Discuz学习笔记——持续更新中

sphinx 检索引擎 sphinx需要装在服务器上,需要中文分词搜索的时候调用 百度搜“php sphinx 模板机制 模板引擎标签 <!--{subtemplate common/header}--> <!--{subtemplate 模板路径}--> <!--......

PHPUI ⋅ 2012/07/15 ⋅ 0

golang web编程

golang web编程 go语言web框架beego的helloword示例 //安装beego模块 //E:>set GOPATH=E:resourceprojectweb_crawler //E:>go get github.com/… golang web编程五:提交url抓取页面内容并且......

d_watson ⋅ 2016/05/27 ⋅ 0

discuz插件命名规范

Discuz! 按照如下的规范对程序和模板进行命名,请在设计插件时尽量遵循此命名规范: 可以直接通过浏览器访问的普通程序文件,以 .php 后缀命名。 被普通程序文件引用的程序文件,以 .inc.php...

T_star ⋅ 2013/07/08 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部