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

我有一个包含两个字段的结构。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)


呼如林
浏览 159回答 2
2回答

侃侃尔雅

首先,您的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(...)现在。

慕尼黑5688855

看来您的Msg包含Name + " " + Message,因此您需要将其拆分" "。Go 模板是无逻辑的。但是您可以使用辅助函数来添加逻辑。例如:type DataDB struct {&nbsp; &nbsp; ID&nbsp; int&nbsp; &nbsp; Msg string}func (d *DataDB) Name() string {&nbsp; &nbsp; return strings.SplitN(d.Msg, " ", 2)[0]}func (d *DataDB) Message() string {&nbsp; &nbsp; res := strings.SplitN(d.Msg, " ", 2)&nbsp; &nbsp; if len(res) < 2 {&nbsp; &nbsp; &nbsp; &nbsp; return ""&nbsp; &nbsp; }&nbsp; &nbsp; return res[1]}并像这样在模板中使用它们:{{range .}}&nbsp; &nbsp; Hello {{.Name}}, my name is {{.Message}}{{end}}工作示例注意:上面的代码效率稍低,因为它进行了两次拆分,因此最好单独创建一个struct仅用于显示目的并在渲染模板之前填充它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go