test.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "reflect"
  6. "time"
  7. )
  8. type RSS struct {
  9. Items []Item `xml:"channel>item"`
  10. }
  11. type Item struct {
  12. URL string `xml:"guid"`
  13. Title string `xml:"title"`
  14. }
  15. func getData() interface{} {
  16. // return Item{"1", "1"}
  17. return &RSS{
  18. Items: []Item{
  19. Item{"1", "1"},
  20. Item{"2", "2"},
  21. Item{"3", "3"},
  22. Item{"4", "4"},
  23. Item{"5", "5"},
  24. },
  25. }
  26. }
  27. type CacheItem struct {
  28. Data json.RawMessage
  29. // Tags map[string]int
  30. }
  31. type CacheItemStore struct {
  32. Data interface{}
  33. }
  34. var data []byte
  35. func getDeep(in interface{}) {
  36. in = getData()
  37. }
  38. func unpackData(in interface{}, mode bool) error {
  39. if mode == false {
  40. fmt.Println("set in")
  41. tmpIn := getData()
  42. fmt.Println("types", reflect.TypeOf(tmpIn), reflect.TypeOf(in))
  43. fmt.Println("types equal", reflect.TypeOf(tmpIn) == reflect.TypeOf(in))
  44. // fmt.Println(reflect.ValueOf(in))
  45. // reflect.ValueOf(in).Set(tmpIn)
  46. // *tt := *tmpIn
  47. rvp := reflect.ValueOf(in)
  48. fmt.Printf("rvp %+v %+v\n", rvp, rvp.Kind())
  49. if rvp.Kind() != reflect.Ptr {
  50. panic("Ожидается указатель")
  51. }
  52. rvp2 := reflect.ValueOf(tmpIn)
  53. fmt.Printf("rvp2 %+v %+v\n", rvp2, rvp2.Kind())
  54. if rvp2.Kind() != reflect.Ptr {
  55. panic("Ожидается указатель")
  56. }
  57. // rvp.Set(rvp2)
  58. rv := reflect.Indirect(rvp)
  59. fmt.Printf("rv %+v %+v\n", rv, rv.Kind())
  60. rv.Set(reflect.Indirect(rvp2))
  61. // *in = tmpIn
  62. fmt.Println("in in func", in)
  63. // getDeep(in)
  64. return nil
  65. }
  66. d := CacheItemStore{
  67. Data: getData(),
  68. }
  69. d1, err := json.Marshal(d)
  70. fmt.Println(err)
  71. d2 := CacheItem{}
  72. err = json.Unmarshal(d1, &d2)
  73. // fmt.Println(d2, err)
  74. err = json.Unmarshal(d2.Data, &in)
  75. // fmt.Println(in, err)
  76. return nil
  77. }
  78. func main() {
  79. fmt.Println(fmt.Sprint(time.Now().Unix()))
  80. var i = int(time.Now().Unix())
  81. fmt.Println(i)
  82. // d1, _ := json.Marshal(getData())
  83. // fmt.Println(d2)
  84. // d3 := RSS{}
  85. // err := unpackData(&d3, true)
  86. // fmt.Println("result", d3, err)
  87. d3 := &RSS{}
  88. // var v interface{} = d3
  89. err := unpackData(d3, false)
  90. // fmt.Println("v", v)
  91. fmt.Println("d3", d3, err)
  92. time.Sleep(10 * time.Second)
  93. fmt.Println("d3", d3, err)
  94. }