text: Q:
  
  Сортировка JSON структур с помощью interface{}
  
  Есть код в котором надо чтоб определенные структуры JSON(Date json:"d",Revenue json:"r", Gold  json:"g") подсчитывались и все выводилось в формат CSV колонками Date, Revenue, Gold. Вот пример текста JSON из которого должны определенные структуры вытаскиваться, подсчитывaться все выводится в CSV и таких данных много:
  
  "logins":[["2011-11-06",1]],"last_login":"Sun Nov 06 16:52:45 -0800 2011","d":{"2010-11-05":{"gg":0,"r":4.99,"g":0},"2011-06-22":{"gg":0,"1":{"g":100,"r":4.99},"g":100,"r":4.99},"2011-07-16":{"gg":0,"1":{"r":9.99,"g":200},"r":9.99,"g":200},"2010-11-20":{"gg":0,"r":4.99,"g":100}},"h":[{"d":"2011-06-22","wid":"1","g":100,"r":4.99},{"d":"2011-07-16","r":9.99,"g":200,"wid":"1"}],"t":{"gg":0,"1":{"g":300,"r":14.98},"r":24.96,"g":400}}
  
  И вот код в котором надо дописать, я начал писать ниже и вот застрял, там я так понимаю case надо использовать. Буду благодарен за помощь.
  package main
  
  import (
  "database/sql"
  "log"
  _"github.com/go-sql-driver/mysql"
  "compress/zlib"
  "bytes"
  "encoding/json"
  "io/ioutil"
  "sort"
  "encoding/csv"
  "os"
  "strconv"
  "fmt"
  )
  
  var (
      data []byte
      dates []string
   )
  
  type UserStatsData struct {
      Dates map[string]Info `json:"d"`
  }
  
  type Info struct {
      R json.Number `json:"r"`
      G int `json:"g"`
      D string `json:"-"`
  }
  
  func main() {
  
  db, err := sql.Open("mysql", "name:password@tcp(127.0.0.1:port)/database")
  if err != nil {
      panic(err.Error())
  }
  defer db.Close()
  
  rows, err := db.Query(`SELECT data FROM user_stats ORDER BY created_at LIMIT 3`)
  if err != nil {
      log.Fatal(err)
  }
  defer rows.Close()
  
  file, err := os.Create("result.csv")
  if err != nil {
      fmt.Println(err)
  }
  defer file.Close()
  
  cont := 0
  writer := csv.NewWriter(file)
  userStatsData := UserStatsData{}
  for rows.Next() {
      //userStatsData := UserStatsData{}
      err := rows.Scan(&data)
      if err != nil {
          log.Fatal(err)
      }
  
      if err := json.Unmarshal(data, &userStatsData); err != nil {
          r, err := zlib.NewReader(bytes.NewReader(data))
          if err != nil {
              log.Panicf("\nCannot read archive %v", err);
          }
          r.Close()
          data, _ = ioutil.ReadAll(r)
      }
      if err := json.Unmarshal(data, &userStatsData); err != nil{
      panic(err)
      }
  
      for userStats := range userStatsData.Dates {
          dates = append(dates, userStats)
      }
      sort.Strings(dates)
  
      var info []Info
      for _, date := range dates {
          i := userStatsData.Dates[date]
          i.D = date
          info = append(info, i)
      }
  
      for _, i := range info {
          if cont == 0 {
              var record []string
              record = append(record, "Data")
              record = append(record, "Gold")
              record = append(record, "Revenue")
              writer.Write(record)
              cont++
  
          }
          var record []string
          record = append(record, i.D)
          record = append(record, strconv.Itoa(i.G))
          record = append(record, i.R.String())
          writer.Write(record)
          cont++
  
      }
  
      writer.Flush()
      err = writer.Error()
      if err != nil {
          panic(err)
      }
  }
  }
  
  A:
  
  Декодите в мап, берёте ключи, сортируете, энкодите в CSV:
  type Data struct {
      Dates map[string]Info `json:"d"`
  }
  
  type Info struct {
      R json.Number `json:"r"`
      G int         `json:"g"`
      D string      `json:"-"`
  }
  
  d := Data{}
  err := json.Unmarshal(data, &d)
  if err != nil {
      panic(err)
  }
  
  var dates []string
  for k := range d.Dates {
      dates = append(dates, k)
  }
  sort.Strings(dates)
  
  var infos []Info
  for _, date := range dates {
      i := d.Dates[date]
      i.D = date
      infos = append(infos, i)
  }
  
  enc := csv.NewWriter(os.Stdout)
  for _, i := range infos {
      err = enc.Write([]string{i.D, strconv.Itoa(i.G), i.R.String()})
      if err != nil {
          panic(err)
      }
  }
  enc.Flush()
  err = enc.Error()
  if err != nil {
      panic(err)
  }
  
  Playground: https://play.golang.org/p/bD9CzBSu7e.
  
  