go template 模板字符串
普通方式
当我们需要在字符串中拼接参数时可以通过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
这样可以在一定程度上解决无法直观的看到文本的格式问题,但是当需要循环的处理某段数据时,这种方式写出的代码并不雅观。
# 📊 触达挤压统计 📅(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>
💡 建议:可将积压待触达的潜客分配给其他账号进行触达,以保证触达的实时性
👉 操作步骤:登录托管 > 触达明细 > 批量重新分配
如果想要实现如上格式的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 main
import (
"bytes"
"fmt"
"text/template"
"time"
)
// 定义template模板中对应的数据源
type ReachOverstockInformTmpl struct {
Month int
Day int
Overstocks []*OverstockTmplNode
}
type OverstockTmplNode struct {
AccountName string
Status string
Reached 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 main
import (
"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可以直观的看到字符串预期的格式,并且可以更优雅的处理循环传入参数的操作。
原文地址:https://blog.csdn.net/Wksycxy/article/details/143660485
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!