Go模板到结构体

huangapple go评论111阅读模式
英文:

Go template to struct

问题

我有一个Go模板,应该解析为一个结构体。我该如何将模板执行函数的bytes.Buffer结果转换回structPlayground

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/gob"
  5. "fmt"
  6. "log"
  7. "text/template"
  8. )
  9. type Data struct {
  10. Age int
  11. Username string
  12. SubData SubData
  13. }
  14. type SubData struct {
  15. Name string
  16. }
  17. func main() {
  18. s := SubData{Name: "J. Jr"}
  19. d := Data{Age: 26, Username: "HelloWorld", SubData: s}
  20. tmpl := "{{ .SubData }}"
  21. t := template.New("My template")
  22. t, _ = t.Parse(string(tmpl))
  23. buffer := new(bytes.Buffer)
  24. t.Execute(buffer, d)
  25. fmt.Println(buffer)
  26. // 写入
  27. enc := gob.NewEncoder(buffer)
  28. err := enc.Encode(s)
  29. if err != nil {
  30. log.Fatal("编码错误:", err)
  31. }
  32. // 读取
  33. buffer = bytes.NewBuffer(buffer.Bytes())
  34. e := new(SubData)
  35. dec := gob.NewDecoder(buffer)
  36. err = dec.Decode(e)
  37. if err != nil {
  38. log.Fatal("解码错误:", err)
  39. }
  40. fmt.Println(e, err)
  41. }
英文:

I have a Go template that should resolve to a struct. How can I convert the bytes.Bufferresult from template execute function back to the struct. Playground

  1. package main
  2. import (
  3. "bytes"
  4. "encoding/gob"
  5. "fmt"
  6. "log"
  7. "text/template"
  8. )
  9. type Data struct {
  10. Age int
  11. Username string
  12. SubData SubData
  13. }
  14. type SubData struct {
  15. Name string
  16. }
  17. func main() {
  18. s := SubData{Name: "J. Jr"}
  19. d := Data{Age: 26, Username: "HelloWorld", SubData: s}
  20. tmpl := "{{ .SubData }}"
  21. t := template.New("My template")
  22. t, _ = t.Parse(string(tmpl))
  23. buffer := new(bytes.Buffer)
  24. t.Execute(buffer, d)
  25. fmt.Println(buffer)
  26. // writing
  27. enc := gob.NewEncoder(buffer)
  28. err := enc.Encode(s)
  29. if err != nil {
  30. log.Fatal("encode error:", err)
  31. }
  32. // reading
  33. buffer = bytes.NewBuffer(buffer.Bytes())
  34. e := new(SubData)
  35. dec := gob.NewDecoder(buffer)
  36. err = dec.Decode(e)
  37. if err != nil {
  38. log.Fatal("decode error:", err)
  39. }
  40. fmt.Println(e, err)
  41. }

答案1

得分: 5

你不能这样做。这根本是不可能的。

但是为什么会有人想要做这样的事情呢?为什么不直接通过 gob 发送和解码你的 Data 呢?为什么要创建一个文本表示然后再进行 gob 编码呢?

英文:

You cannot. This is plain simply impossible.

But why on earth would anybody want to do something like this? Why don't you just send your Data directly via gob and decode it directly? Why creating a textual representation which you gob?

huangapple
  • 本文由 发表于 2014年8月7日 19:24:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/25181266.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定