为了账号安全,请及时绑定邮箱和手机立即绑定

如何解析具有格式化字符串变量的模板?

如何解析具有格式化字符串变量的模板?

Go
呼如林 2022-04-26 15:30:49
我有一个包含两个字段的结构。Msg 字符串将是 fmt.Sprintf("%s %s"),我需要将模板解析为字符串中的这两个变量type DataDB struct {    ID  int    Msg string}尝试在这里解析模板,预期的结果应该是 - 你好贾斯汀,我的名字是 abc    var name = "justin"    var msg = "abc"    justin := DataDB{ID: 1, Msg: fmt.Sprintf("%s %s", name, msg)}    s := []DataDB{justin}    tpl, err := template.New("msgs").Parse(` {{range .}}     Hello {{.name}}, my name is {{.msg}}     {{end}}     `)    if err != nil {        panic(err)    }    tpl.Execute(os.Stdout, s)
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

首先,您的DataDB结构没有名称字段,因此您将无法在模板中引用它。


将您的模板更新为以下内容:


type DataDB struct {

    ID  int

    Name string

    Msg string

}

然后在您的声明中设置一个名称


justin := DataDB{ID: 1, Name: name, Msg: msg}


现在您可以.Name在模板中引用该字段


tpl, err := template.New("msgs").Parse(`

    {{range .}}

    Hello {{.Name}}, my name is {{.Msg}}

    {{end}}

`)

最后,在模板中引用字段时,需要导出字段,所以它们都应该以大写字母开头。请参阅上面我的 DataDB 结构版本。


编辑,你不需要fmt.Sprintf(...)现在。


查看完整回答
反对 回复 2022-04-26
?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

看来您的Msg包含Name + " " + Message,因此您需要将其拆分" "。


Go 模板是无逻辑的。但是您可以使用辅助函数来添加逻辑。


例如:


type DataDB struct {

    ID  int

    Msg string

}


func (d *DataDB) Name() string {

    return strings.SplitN(d.Msg, " ", 2)[0]

}


func (d *DataDB) Message() string {

    res := strings.SplitN(d.Msg, " ", 2)

    if len(res) < 2 {

        return ""

    }

    return res[1]

}

并像这样在模板中使用它们:


{{range .}}

    Hello {{.Name}}, my name is {{.Message}}

{{end}}

工作示例


注意:上面的代码效率稍低,因为它进行了两次拆分,因此最好单独创建一个struct仅用于显示目的并在渲染模板之前填充它。


查看完整回答
反对 回复 2022-04-26
  • 2 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号