#### 问题描述
众所周知,使用 Go 的 `text/template` 包可以基于结构体的内容对模版进行渲染,那么该过程是否是可逆的呢?换句话说如果已知 text 模版以及渲染后的结果,能否得到原始结构体的内容呢?(类似 JSON 序列化/反序列化那味儿)
项目中用到了,在此请教各位大佬,针对上述的问题,有可行的方案吗?
不知道我下面这种2次渲染能不能满足你的需求,第一次渲染的结果还是一个模板,第二次渲染时得到最终结果并且将第一次模板里面的数据取出来。
```go
package main
import (
"bytes"
"fmt"
"text/template"
)
func main() {
t, err := template.New("ENC").Funcs(template.FuncMap{
"ENC": func(key, val string) string {
return fmt.Sprintf("{{DEC \"%s\" \"%s\"}}", key, val)
},
}).Parse(`user: {{ENC "user" .user}},pass: {{ENC "pass" .pass}}`)
if err != nil {
panic(err)
}
var str bytes.Buffer
err = t.ExecuteTemplate(&str, "ENC", map[string]string{
"user": "张三", "pass": "admin",
})
if err != nil {
panic(err)
}
s0 := str.String()
fmt.Println(s0) // 第一次渲染,但这次的结果不能直接使用
// 第二次渲染,将模板里面的数据取出到data中,并且生成最终渲染的结果
data := make(map[string]string)
t, err = t.New("DEC").Funcs(template.FuncMap{
"DEC": func(key, val string) string {
data[key] = val
return val
},
}).Parse(s0)
if err != nil {
panic(err)
}
str.Reset()
err = t.ExecuteTemplate(&str, "DEC", nil)
if err != nil {
panic(err)
}
s1 := str.String()
fmt.Println(data) // 从模板中取出的数据
fmt.Println(s1) // 最终正常渲染后使用的数据
}
```
#7
更多评论