传送门: 柏链项目学院


go语言与模版编程

什么是模版编程

模板是将一个事物的结构规律予以固定化、标准化的成果,它体现的是结构形式的标准化。对于我们程序员来说,更直白的理解是;对于要输出的内容,个人位置需要参数化填充,需要填充的参数位置是固定的,输出的内容是有统一标准的。就像是我们小时候做的填空题,题目固定,有固定的位置需要填充,模版就是原理。

go语言模版编程步骤

go语言开发了专门的packge用于支持模版编程,我们开发过程中,有时候会碰到模版编程得到情况,比如想要实现自动化的输出一些用于其他工程执行的有效代码,或者形成一些前端页面,都会用到模版编程。

go语言中模版编程分为两个大方向,一种是真的前端的,是在html/template下,还有一个是针对文本的,在text/template下,两者套路类似,我们来说一下对于文本的处理。

模版编程可分为4步:

  • 定义模版
  • 创建模版
  • 模版数据准备
  • 模版执行

我们可以先看官方示例给的代码,把步骤重新认识一遍。

type Inventory struct {
Material string
Count uint
}
sweaters := Inventory{"wool", 17}
tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}")
if err != nil { panic(err) }
err = tmpl.Execute(os.Stdout, sweaters)
if err != nil { panic(err) }

所谓的定义模版就是Parse中的内容:

{{.Count}} items are made of {{.Material}}

template调用New以及后面的Parse就是创建模版:

tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}")
if err != nil { panic(err) }

模版数据的准备是指结构定义和数据准备:

type Inventory struct {
Material string
Count uint
}
sweaters := Inventory{"wool", 17}

模版执行是Execute,注意模版执行时需要指定输出描述符(可以是某个文件或者标准输出,对应的go语言中的io.writer)

err = tmpl.Execute(os.Stdout, sweaters)

上述例子就是一个最为简单的模版编程,更详尽的可以看这里:官方详细资料

上述例子除了阐述模版编程的四步之外,还有一个重要信息,模版编程在执行的时候,对数据结构体有要求,模版使用{{}}包含的变量名字必须在结构体有其对应,否则执行的时候将不能成功。

下面是模版编程里的一些actions介绍。

{{/* a comment */}} 注释
{{pipeline}} 模版的变量
{{if pipeline}} T1 {{end}} 如果pipeline为空,则T1不会执行,
{{if pipeline}} T1 {{else}} T0 {{end}} 这是在上面的基础上增加了else分支
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}} 当然还可以else if,这些对熟悉编程的人来说不算什么
{{range pipeline}} T1 {{end}} 这个要求pipeline是一个数组,可以循环输出T1
{{range pipeline}} T1 {{else}} T0 {{end}} 这个就是pipeline为空则执行T0
{{with pipeline}} T1 {{end}} with和if类似,如果pipeline存在,则执行T1
{{with pipeline}} T1 {{else}} T0 {{end}} 同样的else分支处理

我们来看一些复杂点的例子:

package main

import (
"fmt"
"os"
"text/template"
) // Define a template.
const letter = `
Dear {{.Name}},
{{if .Attended}}
It was a pleasure to see you at the wedding.{{else}}
It is a shame you couldn't make it to the wedding.{{end}}
{{with .Gift}}Thank you for the lovely {{.}}.
{{end}}
Best wishes,
Josie
` func main() { // Prepare some data to insert into the template.
type Recipient struct {
Name, Gift string
Attended bool
}
var recipients = []Recipient{
{"Aunt Mildred", "bone china tea set", true},
{"Uncle John", "moleskin pants", false},
{"Cousin Rodney", "", false},
} // Create a new template and parse the letter into it.
t := template.Must(template.New("letter").Parse(letter)) // Execute the template for each recipient.
for _, r := range recipients {
err := t.Execute(os.Stdout, r)
if err != nil {
fmt.Println("executing template:", err)
}
}
}

上述代码是一个写信的模版,收信方是一个固定填充位置,Attended是一个附加信息,如果为真,则为受邀参加婚礼,为假则不被邀请。Gift则是对礼物的描述,如果礼物不为空,则该收信人会有礼物,否则没有。

根据数据情况recipients来看,只有第一个人受邀参加婚礼,前两个人会有礼物,所以最终的执行结果如下:

Dear Aunt Mildred,

It was a pleasure to see you at the wedding.
Thank you for the lovely bone china tea set. Best wishes,
Josie Dear Uncle John, It is a shame you couldn't make it to the wedding.
Thank you for the lovely moleskin pants. Best wishes,
Josie Dear Cousin Rodney, It is a shame you couldn't make it to the wedding. Best wishes,
Josie

go语言模版编程的更多相关文章

  1. 【转载】ANSYS的APDL与C语言混合编程(实例)

    原文地址:http://www.cnblogs.com/lyq105/archive/2010/05/04/1727557.html 本文讨论的不是利用C语言为ANSYS写扩展(或者说是用户子程序), ...

  2. [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int.long.float等)的变量,也可以是一些复合数据类型(如 arr ...

  3. Mysql C语言API编程入门讲解

    原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程.   ...

  4. 为什么还坚持.NET? 找一门适合自己的语言去做编程

    为什么还坚持.NET? 找一门适合自己的语言去做编程 接触了.NET快十二年了,现在专注于分布式服务的开发. 中间经历过各种编程语言的诱惑,ios等. 前几年才对自己有比较明确的定位 技术上:找到适合 ...

  5. Go语言 并发编程

    Go语言 并发编程 作者:Eric 微信:loveoracle11g 1.创建goroutine // 并行 是两个队列同时使用两台咖啡机 // 并发 是两个队列交替使用一台咖啡机 package m ...

  6. C语言socket编程

    建议先去看一下思路 真的写的很不错呦~ 思路参考博客:https://www.cnblogs.com/renfanzi/p/5713054.html linux c语言socket编程代码(单一服务端 ...

  7. 融云开发漫谈:你是否了解Go语言并发编程的第一要义?

    2007年诞生的Go语言,凭借其近C的执行性能和近解析型语言的开发效率,以及近乎完美的编译速度,席卷全球.Go语言相关书籍也如雨后春笋般涌现,前不久,一本名为<Go语言并发之道>的书籍被翻 ...

  8. linux下C语言多线程编程实例

    用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...

  9. 【C/C++】struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招

    本文为笔者阅读<嵌入式C精华>的摘录,推荐一下,不错的书 一.C/C++语言 struct深层探索 1.自然对界 struct是一种复合数据类型,其构成元素既可以是基本数据类型(如 int ...

随机推荐

  1. jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码

    需求: 抽奖代码最多可以抽奖5次,而且,每次只会中“2000元理财金”或者“谢谢参与”,其它的不会抽中(哈哈,果然都是套路). 效果如下: 一.页面结构: ? 1 2 3 4 5 6 7 8 9 10 ...

  2. Process 'command 'D:\jdk8\jdk\bin\java.exe'' finished with non-zero exit value 2

    转载请标明出处,维权必究:https://www.cnblogs.com/tangZH/p/10539006.html 捣鼓了好久,现在已经不想说话,为何会出现这个问题,Process 'comman ...

  3. 微信小程序后端开发(Java语言)笔记

    前言: 因为是第一次真正接触后端开发,从编码到部署服务器到上线,所以做个笔记,也供和我一样的开发小白一些参考. 一.前期工作:开发环境与工具: 1. 编程语言:Java    #笔者还没学PHP,只想 ...

  4. 今年开搞了,搭建一下vue开发环境

    首先-->搞了几天的SpringBoot玩的差不多了,领导直接说, 别项目组需要做前后端分离,说前端缺少人手,没有办法咯,只能硬着头皮去了, 说先学一下'vue',给我个文档让我学学,说是前半年 ...

  5. 使用Chrome 中的 ssh 插件登陆 linux 服务器

    . 在chrome 商店中搜索 secure shell , 安装 Secure Shell Extension 2. 安装完成后,就可以在应用程式中找到Secure Shell App 3.点击 S ...

  6. lombok的安装

    Lombok简介 Lombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法.官方地址:https:/ ...

  7. docker 发布到私有docker registry

    1.使用vs发布项目到文件夹: 2.在文件夹中新建dockerfile文件, 内容: FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-sli ...

  8. 教你如何把openfire的muc聊天室改造为群

    openfire群聊与QQ群对比 应该是去年的时候开始接触openfire,当时在分析后发现基于xmpp协议的openfire已经具备了群聊的功能.也就没太当回事,觉得加点功能就可以做成类似于QQ群的 ...

  9. 你可能需要为你的 APP 适配 iOS 11

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/AZFrqL9dnlgA6Vt2sVhxIw 作者:s ...

  10. jquery判空 string类型的日期比较大小

    jquery 判空 if(value.length<=0){  alert("kongzhi"); } jquery string类型的日期比较大小 var startTim ...