【问题标题】:Golang Structs/InterfacesGolang 结构/接口
【发布时间】:2016-10-15 13:33:06
【问题描述】:

我正在尝试做一些事情来动态地将 SQL 结果结构化,基本上我想通过传递行和结构来运行一个函数(以获取数据类型并制作一个)并在接口数组中返回。

有人知道我该怎么做吗?

我不想将直接的“用户”结构作为参数传递.. 这不是动态的

type User struct{
   Id_user int `json:"id_user"`
   Name string `json:"name"`
   Email string `json:"email"`
   Username string `json: "username"`
}

func main() {
  var user User
  rows, _ := db.Query("SELECT id_user, name, email, username FROM users")
  json.NewEncoder(w).Encode(StructRow(user, rows)) 
}

func StructRow(u interface{}, rows *sql.Rows)[]interface{}{
   var data []interface{}
   for rows.Next() {

      //How i can create a "user" here, dynamically
      //for Example
      //var user reflect.TypeOf(u)

      _ = rows.Scan(StrutForScan(&user)...)
      data = append(data, user)
   }
   return data
}

func StrutForScan(u interface{}) []interface{} {
   val := reflect.ValueOf(u).Elem()
   v := make([]interface{}, val.NumField())
   for i := 0; i < val.NumField(); i++ {
      valueField := val.Field(i)
      v[i] = valueField.Addr().Interface()
   }
   return v
}

【问题讨论】:

  • 我认为ORM 可能会帮助您。
  • 你为什么要坚持定制一个新的接口来存储值?只是您想要一种无需知道目标类型就可以扫描行的方法吗?可能值得一试sqlx,它向数据库添加了几个额外的方法,让您可以直接扫描到结构中,而不必显式地提供每个字段或切片。这样,您的扫描功能只需要接受一个接口并将其盲目传递给db.Select()db.Get()
  • 哦,好的,谢谢。

标签: go struct interface


【解决方案1】:

将你的函数 StructRow 更改为

 func StructRow(u interface{}, rows *sql.Rows) []interface{} {
    var data []interface{}
    for rows.Next() {

         t := reflect.TypeOf(u)
         val := reflect.New(t).Interface()

         errScan := rows.Scan(StrutForScan(val)...)
         if errScan != nil {
             //proper err handling
         }
         data = append(data, val)
    }
    return data
 }

会修复它。我猜。 有关反射包的更多信息,请访问:https://golang.org/pkg/reflect/

【讨论】:

  • 谢谢 :) 你知道我如何将 StructRow 和 StructForScan 结合在同一个函数中吗?
  • 我认为您实施的方法非常简单:)。同样如上面 cmets 所述,请查看 github.com/jmoiron/sqlx 。我也做到了。真是太棒了。
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 2020-03-31
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-10
相关资源
最近更新 更多