场景

有时候需要使用go的模板语法,比如说用go 去渲染html页面的时候,再比如说用go的模板搞代码生成的时候。这时候可能会遇到一个麻烦,不想转译的特殊字符被转译了。

我遇到的情况是写代码生成器的时候,‘<’ 符号被转译了,导致channel 相关的部分有问题。

这个问题很简单,但是资料不多,我也是试了半天才发现。其实把包含特殊字符的字符串 先转成 template.HTML 类型再加载到文件里 就可以了。

解决

先看代码

  1. t := template.New("initMysql")
  2. type NsqConsumerTpl struct {
  3. Names []string
  4. AngleBracket template.HTML
  5. }
  6. v := NsqConsumerTpl{
  7. Names: nsqConsumerIns,
  8. AngleBracket:template.HTML("<")
  9. }

这里首先声明了一个模板,然后声明一个结构体,用于在模板里的渲染。 其AngleBracket 字段即为一个 在模板里 不被转译的特殊字符字段。这里我用来放‘<’了.

下面的这段代码,声明一段模板,然后模板内直接引用 这个字段即可,此时 ‘<’ 不会被转译。

  1. tpl := `func (p *NsqConsumerMgr) Start() error {
  2. {{range .Names}}
  3. err := p.{{.}}.ConnectToNSQLookupds(p.{{.}}.LookupAddr)
  4. if err != nil {
  5. panic(err)
  6. }
  7. {{end}}
  8. ch := make(chan bool)
  9. {{ .AngleBracket }}-ch
  10. return nil
  11. }`
  12. t.Execute(tpl, v)

如果不只一个地方使用的话,可以提出来一个函数

定义函数,函数内容很简单,把str转成temp.HTML类型。

  1. func unescaped (str string) template.HTML { return template.HTML(str) }

把函数注册到模板:

  1. t = t.Funcs(template.FuncMap{"unescaped": unescaped})

这时候,用于渲染的结构体,特殊字符也可以直接用string

  1. type NsqConsumerTpl struct {
  2. Names []string
  3. AngleBracket string
  4. }

模板内使用稍有不同,{{ .AngleBracket | unescaped}} 这一句的意思是: 通过 通道(类似linux 通道的概念)把AngleBracket 作为参数,传给unescaped 函数。

  1. func (p *NsqConsumerMgr) Start() error {
  2. {{range .Names}}
  3. err := p.{{.}}.ConnectToNSQLookupds(p.{{.}}.LookupAddr)
  4. if err != nil {
  5. panic(err)
  6. }
  7. {{end}}
  8. ch := make(chan bool)
  9. {{ .AngleBracket | unescaped}}-ch
  10. return nil
  11. }
  12. t.Execute(tpl, v)

说起来比较简单,但是资料很少,查起来比较费劲,于是总结与此,分享一下。

欢迎补充

有收获记得点赞哦~

golang 模板语法使不解析html标签及特殊字符的更多相关文章

  1. golang模板语法简明教程

    [模板标签] 模板标签用"{{"和"}}"括起来   [注释] {{/* a comment */}} 使用“{{/*”和“*/}}”来包含注释内容   [变量 ...

  2. golang模板语法简明教程(后面有福利哦)

    template是go 语言web开发中必不可少的,特此记录下来: [模板标签] 模板标签用"{{"和"}}"括起来   [注释] {{/* a comment ...

  3. golang模板语法

    https://www.cnblogs.com/Pynix/p/4154630.html https://blog.csdn.net/huwh_/article/details/77140664 ht ...

  4. Django——模板层(template)(模板语法、自定义模板过滤器及标签、模板继承)

    前言:当我们想在页面上给客户端返回一个当前时间,一些初学者可能会很自然的想到用占位符,字符串拼接来达到我们想要的效果,但是这样做会有一个问题,HTML被直接硬编码在 Python代码之中. 1 2 3 ...

  5. Django 模板 语法 变量 过滤器 模板继承 组件 自定义标签和过滤器 静态文件相关

    本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法 ...

  6. Django的View(视图)-settings源码的解析-模板层-模板语法

    FBV与CBV 视图函数并不只是指函数,也可以是类 FBV:基于函数的视图,类似面向函数式编程 CBV:基于类的视图,类似面向对象编程 研究解析render源码: render:返回html页面:并且 ...

  7. PHPCMS标签:PC标签模板语法规则

    模板语法规则1.变量表示{$name} 被解析成 <?=$name?>,表示显示变量$name的值,其中的“name”由英文字母.数字和下划线组成首字母必须是英文字母或者下划线. 2.常量 ...

  8. 【Thymeleaf】Thymeleaf模板对没有结束符的HTML5标签解析出错的解决办法

    解决方案 spring: thymeleaf: mode: LEGACYHTML5 <dependency> <groupId>net.sourceforge.nekohtml ...

  9. golang 模板(template)的常用基本语法

    1. 模板 在写动态页面的网站的时候,我们常常将不变的部分提出成为模板,可变部分通过后端程序的渲染来生成动态网页,golang提供了html/template包来支持模板渲染. 这篇文章不讨论gola ...

随机推荐

  1. 逆向工程初步160个crackme-------4

    crackme–3因为涉及到浮点数操作以及一些指令和寄存器(由于本人对浮点指令不了解),所以先隔过去分析后面的程序. 工具:1. 按钮事件地址转换工具E2A 2. PEID 3. Ollydbg 首先 ...

  2. Springboot项目之阿里云OSS快速入门

    阿里云oss 阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量.安全.低成本.高可靠的云存储服务.您可以通过本文档提供的简单的REST接口,在任何 ...

  3. Ubuntu 15.04下安装Docker

    最近听说Docker很火,不知道什么东西,只知道是一个容器,可以跨平台.闲来无事,我也来倒弄倒弄.本文主要介绍:Ubuntu下的安装,以及基本的入门命令介绍:我的机器是Ubuntu 15.04 64位 ...

  4. centos 7 启动和关闭zabbix 服务

    systemctl start zabbix-server  启动服务端 systemctl stop zabbix-server  停止服务端 systemctl start zabbix-agen ...

  5. 查看当前目录下文件个数: $find ./ | wc -l

    2.1. 创建和删除 创建:mkdir 删除:rm 删除非空目录:rm -rf file目录 删除日志 rm *log (等价: $find ./ -name "*log" -ex ...

  6. ssh判断免密登陆

    ssh判断免密登陆 [root@jenkins ~]# vi /opt/release_code.sh #!/bin/bash . /etc/init.d/functions #echo $WORKS ...

  7. JavaSE 知识图谱

    JAVA基础语法 DOS命令 JAVA介绍 JDK安装 JAVA环境的搭建 关键字 注释 标识符命名规则(编码规范) 字面值常量 进制转换 基本类型 变量(局部变量.静态变量) 运算符 表达式 控制语 ...

  8. go输出九九乘法表和金字塔

    用go语言实现输出九九乘法表和金字塔: 1.输出九九乘法表: 代码示例: package main import ( "fmt" "time" ) //实现99 ...

  9. 2. Servlet3.0注解方式 @WebServlet

    web.xml配置还是比较麻烦,这次使用注解方式 编写servlet import javax.servlet.ServletException; import javax.servlet.annot ...

  10. properties模板

    jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/ssmdemo1?useSSL=true&useUn ...