duanfei9278 2014-10-01 00:14
浏览 21
已采纳

前往:在JSON响应中从数据库中复制各种类型的数据

I'm trying to to get a set of data from my database and return them in a json format. However, they are of different types and I seem to be using the wrong return types in my code.

Go:

type Script struct {
    Id         int    `json:"id"`
    Type       string    `json:"type"`
    Created_at int `json:"created_at"`
}

type AllContent struct {
    New_content     []*Script `json:"new_content,omitempty"`
}

func ReadAllContent() [][]interface{} {
    err := db.Ping()
    if err != nil {
        log.Fatal(err)
}
    rows, err := db.Query("SELECT id, type, created_at FROM script WHERE user_id = $1", user_id)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    var Type string
    var created_at, id int
    for rows.Next() {
        err := rows.Scan(&id, &Type, &created_at)
        if err != nil {
            log.Fatal(err)      
        }
        var a []interface{}
        var b []interface{}
        a = append(a, id, Type, created_at)
        b = append(b, a)
    }
    return b
}

func pingHandler(w http.ResponseWriter, r *http.Request) {

    var s []Script
    resp := AllContent{New_content: []*Script{}}
    m := ReadAllContent()

    for i := 0; i < len(m); i++ {
        s = append(s, Script{Id: m[i][0], Type: m[i][1], Created_at: m[i][2])
    }
    for i := 0; i < len(m); i++ {
        resp.New_content = append(resp.New_content, &s[i])
    }

    w.Header().Set("Content-Type", "application/json")

    js, _ := json.Marshal(resp)
    w.Write(js)
}

I get this error:

cannot use m[i][0] (type interface {}) as type int in field value: need type assertion

What should I resolve?

  • 写回答

1条回答 默认 最新

  • douyan6742 2014-10-01 00:20
    关注

    You can fix the compiler error by adding type assertions:

        s = append(s, Script{Id: m[i][0].(int), Type: m[i][1].(string), Created_at: m[i][2].(int))
    

    A better and simpler approach is to return a slice of script objects from ReadAllContent:

    func ReadAllContent() []*Script {
        var result []*Script
        err := db.Ping()
        if err != nil {
            log.Fatal(err)
         }
    
        rows, err := db.Query("SELECT id, type, created_at FROM script WHERE user_id = $1", user_id)
        if err != nil {
            log.Fatal(err)
        }
        defer rows.Close()
        for rows.Next() {
            s := &Script{}
            err := rows.Scan(&s.ID, &s.Type, &s.Created_at)
            if err != nil {
                log.Fatal(err)      
            } 
            result = append(result, s)
        }
        return result
    }
    

    You can then encode the return from ReadAllContent directly to JSON:

     func pingHandler(w http.ResponseWriter, r *http.Request) {
        w.Header().Set("Content-Type", "application/json")
        if err := json.NewEncoder(w).Encode(&AllContent{New_content: ReadAllContent()}); err != nil {
          // handle error
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败