普通方式
当我们需要在字符串中拼接参数时可以通过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 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可以直观的看到字符串预期的格式,并且可以更优雅的处理循环传入参数的操作。