golang 模板语法使不解析html标签及特殊字符
场景
有时候需要使用go的模板语法,比如说用go 去渲染html页面的时候,再比如说用go的模板搞代码生成的时候。这时候可能会遇到一个麻烦,不想转译的特殊字符被转译了。
我遇到的情况是写代码生成器的时候,‘<’ 符号被转译了,导致channel 相关的部分有问题。
这个问题很简单,但是资料不多,我也是试了半天才发现。其实把包含特殊字符的字符串 先转成 template.HTML 类型再加载到文件里 就可以了。
解决
先看代码
t := template.New("initMysql")
type NsqConsumerTpl struct {
Names []string
AngleBracket template.HTML
}
v := NsqConsumerTpl{
Names: nsqConsumerIns,
AngleBracket:template.HTML("<")
}
这里首先声明了一个模板,然后声明一个结构体,用于在模板里的渲染。 其AngleBracket 字段即为一个 在模板里 不被转译的特殊字符字段。这里我用来放‘<’了.
下面的这段代码,声明一段模板,然后模板内直接引用 这个字段即可,此时 ‘<’ 不会被转译。
tpl := `func (p *NsqConsumerMgr) Start() error {
{{range .Names}}
err := p.{{.}}.ConnectToNSQLookupds(p.{{.}}.LookupAddr)
if err != nil {
panic(err)
}
{{end}}
ch := make(chan bool)
{{ .AngleBracket }}-ch
return nil
}`
t.Execute(tpl, v)
如果不只一个地方使用的话,可以提出来一个函数
定义函数,函数内容很简单,把str转成temp.HTML类型。
func unescaped (str string) template.HTML { return template.HTML(str) }
把函数注册到模板:
t = t.Funcs(template.FuncMap{"unescaped": unescaped})
这时候,用于渲染的结构体,特殊字符也可以直接用string
type NsqConsumerTpl struct {
Names []string
AngleBracket string
}
模板内使用稍有不同,{{ .AngleBracket | unescaped}} 这一句的意思是: 通过 通道(类似linux 通道的概念)把AngleBracket 作为参数,传给unescaped 函数。
func (p *NsqConsumerMgr) Start() error {
{{range .Names}}
err := p.{{.}}.ConnectToNSQLookupds(p.{{.}}.LookupAddr)
if err != nil {
panic(err)
}
{{end}}
ch := make(chan bool)
{{ .AngleBracket | unescaped}}-ch
return nil
}
t.Execute(tpl, v)
说起来比较简单,但是资料很少,查起来比较费劲,于是总结与此,分享一下。
欢迎补充
有收获记得点赞哦~
golang 模板语法使不解析html标签及特殊字符的更多相关文章
- golang模板语法简明教程
[模板标签] 模板标签用"{{"和"}}"括起来 [注释] {{/* a comment */}} 使用“{{/*”和“*/}}”来包含注释内容 [变量 ...
- golang模板语法简明教程(后面有福利哦)
template是go 语言web开发中必不可少的,特此记录下来: [模板标签] 模板标签用"{{"和"}}"括起来 [注释] {{/* a comment ...
- golang模板语法
https://www.cnblogs.com/Pynix/p/4154630.html https://blog.csdn.net/huwh_/article/details/77140664 ht ...
- Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)
前言:当我们想在页面上给客户端返回一个当前时间,一些初学者可能会很自然的想到用占位符,字符串拼接来达到我们想要的效果,但是这样做会有一个问题,HTML被直接硬编码在 Python代码之中. 1 2 3 ...
- Django 模板 语法 变量 过滤器 模板继承 组件 自定义标签和过滤器 静态文件相关
本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法 模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法 ...
- Django的View(视图)-settings源码的解析-模板层-模板语法
FBV与CBV 视图函数并不只是指函数,也可以是类 FBV:基于函数的视图,类似面向函数式编程 CBV:基于类的视图,类似面向对象编程 研究解析render源码: render:返回html页面:并且 ...
- PHPCMS标签:PC标签模板语法规则
模板语法规则1.变量表示{$name} 被解析成 <?=$name?>,表示显示变量$name的值,其中的“name”由英文字母.数字和下划线组成首字母必须是英文字母或者下划线. 2.常量 ...
- 【Thymeleaf】Thymeleaf模板对没有结束符的HTML5标签解析出错的解决办法
解决方案 spring: thymeleaf: mode: LEGACYHTML5 <dependency> <groupId>net.sourceforge.nekohtml ...
- golang 模板(template)的常用基本语法
1. 模板 在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页,golang提供了html/template包来支持模板渲染. 这篇文章不讨论gola ...
随机推荐
- Docker------阿里云部署私有镜像仓库
Docker------阿里云部署私有镜像仓库 前言 公共镜像仓库 官方:https://hub.docker.com/ 基于各个软件开发或者软件提供方开发的 非官方:其它组织或公司开发的镜像,供 ...
- Rust trait
Rust trait Rust中的trait类似于Java中的接口,定义了一组可以被类型选择实现的"契约"或共享行为,. 特征定义: trait Playable{ fn play ...
- liveCD版: CD光盘映像,和liveDVD一样,唯一的区别就是该版本中包含的软件包会少一点,安装系统时使用 U 盘或者CD光盘进行安装。
https://man.linuxde.net/download/CentOS/ CentOS,英文全称"Community Enterprise Operating System" ...
- Apache Flink 1.12.0 正式发布,DataSet API 将被弃用,真正的流批一体
Apache Flink 1.12.0 正式发布 Apache Flink 社区很荣幸地宣布 Flink 1.12.0 版本正式发布!近 300 位贡献者参与了 Flink 1.12.0 的开发,提交 ...
- power delivery功率输出
delivery
- MyBatis 延迟加载(十四)
什么是延迟加载 延迟加载又叫懒加载,也叫按需加载,也就是说先加载主表信息,需要的时候,再去加载从表信息.代码中有查询语句,当执行到查询语句时,并不是马上去数据库中查询,而是根据设置的延迟策略将查询向后 ...
- FD_SET -(转自 kakaxia6337的专栏)
FD_ZERO,FD_ISSET这些都是套节字结合操作宏 看看MSDN上的select函数, 这是在select io 模型中的核心,用来管理套节字IO的,避免出现无辜锁定. int se ...
- 常见判断错误 (Day_30)
写给自己的话: 这是一个卡了我小半天的BUG,也是一个很低端的BUG,写篇博客吧,以后回来看看,会发现曾经的自己是如何的菜. 同样,以此记录我的进步 步入正题,这是我实现多条件分页时遇到的一个BUG, ...
- nginx 配置 conf stream
nginx从1.9.0版本开始,新增了ngx_stream_core_module模块,使nginx支持四层负载均衡.默认编译的时候该模块并未编译进去,需要编译的时候添加--with-stream参数 ...
- git&nodejs安装教程
git https://www.cnblogs.com/ximiaomiao/p/7140456.html nodejs https://jingyan.baidu.com/article/e7505 ...