go template 模板字符串

embedded/2024/11/13 10:34:17/

普通方式

当我们需要在字符串中拼接参数时可以通过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/embedded/136495.html

相关文章

Vue3中实现原生CSS完成圆形按钮点击粒子效果和定点旋转动画

效果&#xff1a; 源码&#xff1a; <script setup> import { ElMessage } from "element-plus"; const isClick () > {ElMessage.success(Clicked); }; </script><template><button click"isClick" class"button">…

RAGulator:如何识别和缓解大模型所谓的“忠实幻觉”

RAGulator&#xff0c;一个轻量级的、用于检测RAG系统中语义上与上下文不符&#xff08;OOC&#xff09;的LLM生成文本的检测器 论文链接:https://arxiv.org/abs/2411.03920 论文概述 实时检测大型语言模型&#xff08;LLM&#xff09;生成的与上下文不符的输出问题&#xff…

ECCV2024新鲜出炉!动态再训练-更新用于无源目标检测的Mean Teacher

原文标题:Dynamic Retraining-Updating Mean Teacher for Source-Free Object Detection 中文标题:动态再训练-更新用于无源目标检测的Mean Teacher 想要快速了解这篇文章的可以看这篇分享: 论文速读:动态再训练-更新用于无源目标检测的Mean Teacher(ECCV2024)-CSDN博客

【数学二】线性代数-矩阵-初等变换、初等矩阵

考试要求 1、理解矩阵的概念,了解单位矩阵、数量矩阵、对角矩阵、三角矩阵、对称矩阵、反对称矩阵和正交矩阵以及它们的性质. 2、掌握矩阵的线性运算、乘法、转置以及它们的运算规律,了解方阵的幂与方阵乘积的行列式的性质. 3、理解逆矩阵的概念,掌握逆矩阵的性质以及矩阵可…

大模型微调技术 --> 脉络

Step1:脉络 微调技术从最早期的全模型微调演变成如今的各种参数高效微调(PEFT)方法&#xff0c;背后是为了应对大模型中的计算、存储和数据适应性的挑战 1.为什么有微调&#xff1f; 深度学习模型越来越大&#xff0c;尤其是 NLP 中的预训练语言模型(BERT, GPT)系列。如果从…

ArcGIS Pro SDK (二十三)实时要素类

ArcGIS Pro SDK (二十三)实时要素类 文章目录 ArcGIS Pro SDK (二十三)实时要素类1 从实时数据存储连接到实时要素类2 检查实时要素类是否可识别轨迹3 从实时要素类获取追踪 ID 字段4 订阅流数据5 搜索现有数据并订阅流数据6 搜索和订阅取消环境:Visual Studio 2022 + .NE…

软考中级 软件设计师 上午考试内容笔记(个人向)Part.1

软考上午考试内容 1. 计算机系统 计算机硬件通过高/低电平来模拟1/0信息&#xff1b;【p进制】&#xff1a; K n K n − 1 . . . K 2 K 1 K 0 K − 1 K − 2... K − m K n r n . . . K 1 r 1 K 0 r 0 K − 1 r − 1 . . . K − m r − m K_nK_{n-1}...K_2K_1K_0K…

【p2p、分布式,区块链笔记 Torrent】WebTorrent的add和seed函数

在【p2p、分布式&#xff0c;区块链笔记 Torrent】WebTorrent的上传和下载界面的示例中&#xff0c;主要通过WebTorrent类的add和seed函数实现相关功能。这两个函数都返回一个Torrent类对象的实例。 seed函数 import createTorrent, { parseInput } from create-torrent // &…