自学内容网 自学内容网

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可以直观的看到字符串预期的格式,并且可以更优雅的处理循环传入参数的操作。


原文地址:https://blog.csdn.net/Wksycxy/article/details/143660485

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!