go template 模板字符串

news/2024/11/14 19:23:56/

普通方式

当我们需要在字符串中拼接参数时可以通过fmt.Sprintf() 方法实现

func main() {var header = fmt.Sprintf("# 📊 触达挤压统计 📅(%d月%d日)\n<font color=\"comment\">(1小时最多发送40个用户,1天最多发送成功100个用户)</font>\n \n ", time.Now().Month(), time.Now().Day())fmt.Println(header)
}// 输出
// # 📊 触达挤压统计 📅(11月8日)
// <font color="comment">(1小时最多发送40个用户,1天最多发送成功100个用户)</font>// Process finished with the exit code 0  

可行,但是无法直观的看到文本的格式。可以采用反引号 `` 的方式来解决。
● 反引号用于表示 原始字符串(raw string literal)。
● 原始字符串不会处理任何转义字符,内容将按字面值表示。
借此,实现一些简单的markdown格式的字符串,如:

func main() {var header = fmt.Sprintf(`# 📊 触达挤压统计 📅(%d月%d日)
<font color="comment">(1小时最多发送40个用户,1天最多发送成功100个用户)</font>`, time.Now().Month(), time.Now().Day())fmt.Println(header)
}// 输出
// # 📊 触达挤压统计 📅(11月8日)
// <font color="comment">(1小时最多发送40个用户,1天最多发送成功100个用户)</font>// Process finished with the exit code 0  

这样可以在一定程度上解决无法直观的看到文本的格式问题,但是当需要循环的处理某段数据时,这种方式写出的代码并不雅观。

# 📊 触达挤压统计 📅(118日)
<font color="comment">1小时最多发送40个用户,1天最多发送成功100个用户)</font>✅ 账号:测试1状态良好
当日成功触达:1个;当日剩余可触达:1<font color="warning">累计积压待触达:1</font>✅ 账号:测试2状态不好
当日成功触达:2个;当日剩余可触达:2<font color="warning">累计积压待触达:2</font>💡 建议:可将积压待触达的潜客分配给其他账号进行触达,以保证触达的实时性👉 操作步骤:登录托管 > 触达明细 > 批量重新分配

如果想要实现如上格式的Markdown格式的stirng,我们需要对body的最小list进行循环的处理。有没有什么不需要手动循环处理的方法呢?
有,可以使用 “text/template”包优雅的解决这个问题。

template

示例

创建 .tmpl 模板文件

# 📊 触达挤压统计 📅({{.Month}}{{.Day}}日)
<font color="comment">1小时最多发送40个用户,1天最多发送成功100个用户)</font>{{range $index,$value := .Reachs}}✅ 账号:{{$value.AccountName}}{{$value.Status}}  
当日成功触达:{{$value.Reached}}个;当日剩余可触达:{{$value.Residue}}<font color="warning">累计积压待触达:{{$value.WaitReach}}</font>{{end}}💡 建议:可将积压待触达的潜客分配给其他账号进行触达,以保证触达的实时性👉 操作步骤:登录托管 > 触达明细 > 批量重新分配
package mainimport ("bytes""fmt""text/template""time"
)// 定义template模板中对应的数据源
type ReachOverstockInformTmpl struct {Month      intDay        intOverstocks []*OverstockTmplNode
}type OverstockTmplNode struct {AccountName stringStatus      stringReached     int // 当日已到达Residue     int // 当日剩余可到达WaitReach   int // 累计积压触达
}func main() {// 导入刚刚创建的.tmpl文件tmpl, err := template.ParseFiles("template/index.tmpl")if err != nil {fmt.Println(err)}reachs := []*OverstockTmplNode{{"测试1","状态良好",1,1,1,},{"测试2","状态不好",2,2,2,},}data := ReachOverstockInformTmpl{Month:      int(time.Now().Month()),Day:        time.Now().Day(),Overstocks: reachs,}buf := bytes.Buffer{}// 将data上的数据与.tmpl文件上的数据进行解析,并将解析后的数据加载到buf中tmpl.Execute(&buf, data)fmt.Println(buf.String())
}// 输出
// # 📊 触达挤压统计 📅(11月8日)
//<font color="comment">(1小时最多发送40个用户,1天最多发送成功100个用户)</font>
//
//
//✅ 账号:测试1状态良好
//当日成功触达:1个;当日剩余可触达:1个
//<font color="warning">累计积压待触达:1个</font>
//
//
//✅ 账号:测试2状态不好
//当日成功触达:2个;当日剩余可触达:2个
//<font color="warning">累计积压待触达:2个</font>
//
//
//💡 建议:可将积压待触达的潜客分配给其他账号进行触达,以保证触达的实时性
//👉 操作步骤:登录托管 > 触达明细 > 批量重新分配

使用说明

这里只做一些简单的说明,除此 template包还提供了很多好用的方法,感兴趣的可以自行查阅。
{{.}}
.tmpl文件的参数格式为{{.}},其中. 表示根对象,比如上面的示例传入的是data,那么. 表示的就是 data
{{range $index,$value := .}} text {{$value}} {{end}}
range 会迭代 .,我们可以通过 {{$value}}使用。如:

package mainimport ("fmt""os""text/template"
)func main() {// index.tmpl // {{range $index,$value := .}}// index:{{$index}},value: {{$value}}// {{end}}t, err := template.ParseFiles("index.tmpl")if err != nil {fmt.Println(err)}data := []string{"Hello", "World"}t.Execute(os.Stdout, data)
}// 输出:
//
// index:0,value: Hello
//
// index:1,value: World
//
// Process finished with the exit code 0

我们也可以使用{{$value}}的属性,如示例中的:

{{range $index,$value := .Reachs}}
✅ 账号:{{$value.AccountName}}{{$value.Status}}  
当日成功触达:{{$value.Reached}}个;当日剩余可触达:{{$value.Residue}}<font color="warning">累计积压待触达:{{$value.WaitReach}}</font>{{end}}

小结

template可以直观的看到字符串预期的格式,并且可以更优雅的处理循环传入参数的操作。


http://www.ppmy.cn/news/1546259.html

相关文章

FreeRTOS 23:事件组EventGroup创建、删除、置位操作

FreeRTOS 提供了事件标志组的一些相关操作函数&#xff0c;如下表所示&#xff1a; 创建一个事件组 xEventGroupCreate() 动态方式创建事件标志组 xEventGroupCreate()用于创建一个事件组&#xff0c;并返回对应的句柄。 要想使用该函数必须 在头文件 FreeRTOSConfig.h 定义宏…

19、centos7优化

优化条目&#xff1a; 优化条目&#xff1a; 1.sudo管理用户授权 &#xff08;不用root管理,以普通用户的名义通过sudo提权&#xff09; 2.更改默认的远程连接SSH服务端口,禁止root用户远程连接,&#xff08;提前建立普通用户&#xff09;&#xff08;甚至更改为只监听内网IP…

[High Speed Serial ] Xilinx

Xilinx 高速串行数据接口 收发器产品涵盖了当今高速协议的方方面面。GTH 和 GTY 收发器提供要求苛刻的光互连所需的低抖动&#xff0c;并具有世界一流的自适应均衡功能&#xff0c;具有困难的背板操作所需的 PCS 功能。 Versal™ GTY &#xff08;32.75Gb/s&#xff09;&…

1小时搞定魔乐平台AI应用的构建和离线复现

想象一下&#xff0c;只需一小时&#xff0c;你就能在魔乐平台上构建自己的AI应用&#xff0c;并在本地环境中完美复现。听起来是不是很诱人&#xff1f;今天&#xff0c;我们就来手把手教你如何快速上手魔乐社区的space服务&#xff0c;让你的AI创意变为现实。 一 前言&#x…

7 软件维护

软件维护 1、软件维护概念和分类1.1 软件维护概念1.1 软件维护分类完善性维护纠错性维护适应性维护预防性维护 2、软件维护注意事项3、软件维护技术3.1 程序理解3.2 软件再工程3.3 软件逆向工程 1、软件维护概念和分类 1.1 软件维护概念 IEEE/EIA 12207[ISO/IEC2008]中对软件…

Bert完形填空

转载自&#xff1a;| 03_language_model/03_Bert完形填空.ipynb | 基于transformers使用Bert模型做完形填空 |Open In Colab | 完形填空 利用语言模型&#xff0c;可以完成完形填空&#xff08;fill mask&#xff09;&#xff0c;预测缺失的单词。 当前&#xff0c;效果最好的…

数据结构--数组

一.线性和非线性 线性&#xff1a;除首尾外只有一个唯一的前驱和后继。eg&#xff1a;数组&#xff0c;链表等。 非线性&#xff1a;不是线性的就是非线性。 二.数组是什么&#xff1f; 数组是一个固定长度的存储相同数据类型的数据结构&#xff0c;数组中的元素被存储在一…

HashSet判断元素相等性的方法

HashSet判断元素相等性的方法主要依赖于两个关键方法&#xff1a;hashCode()和equals()。以下是HashSet判断元素相等性的详细步骤&#xff1a; 计算哈希码&#xff1a; 当向HashSet中添加元素时&#xff0c;HashSet会首先调用待添加元素的hashCode()方法获取其哈希码。哈希码是…