当前位置: 首页 > article >正文

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  

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

# 📊 触达挤压统计 📅(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 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可以直观的看到字符串预期的格式,并且可以更优雅的处理循环传入参数的操作。


http://www.kler.cn/a/389278.html

相关文章:

  • std::thread线程通知、等待、让渡
  • 绿色能源发展关键:优化风电运维体系
  • 初学Java基础---Day21---正则表达式,日期类,Math类,Random类,System类,Runtime类,大数值运算类,
  • 【cursor添加azure】在cursor中添加azure的openai api
  • 面向对象试题带答案
  • Linux网络管理和修改配置文件
  • HBase 安装与基本操作指南
  • 机器学习与深度学习-1-线性回归从零开始实现
  • MyBatis xml 文件中 SQL 语句的小于号未转义导致报错
  • 高通Quick板上安装编译Ros1 noetic,LeGO_LOAM,FAR_Planner和rslidar_sdk
  • C#里演示使用数学的三角函数
  • 【JavaEE】多线程(1)
  • ssm基于Vue的戏剧推广网站+vue
  • C++ IO流
  • 缺陷的根本原因,出现在代码中的原因可能有哪些?
  • 【架构-37】Spark和Flink
  • rust字符串
  • 如何通过CDN加速提升电商网站双十一购物节用户体验
  • AIGC小红书新赛道,两个平台同时发,操作简单
  • 在 Mac 和 Windows 系统中快速部署 OceanBase