【问题标题】:Convert query result from struct to string for another Golang package将查询结果从结构转换为另一个 Golang 包的字符串
【发布时间】:2019-06-01 04:33:35
【问题描述】:

我在网上和 SO 中搜索了解决方案,但没有找到适用于返回值的解决方案。这是一个简单的 sql 查询,有几行我想返回。不包括错误处理:

func Fetch(query string) (string) {

    type User struct{
        id string
        name string
    }

    rows, err := db.Query(query)

    users := make([]*User, 0)
    for rows.Next() {
      user := new(User)
      err := rows.Scan(&user.id, &user.name)
      users = append(users, user)
    }

    return(users)
}

编译时出现这个错误:

不能在返回参数中使用用户(类型 []*User)作为类型字符串

如何才能得到正确的返回值?

预期的输入是

JD John Doe --OR-- {id:"JD",name:"John Doe"}

【问题讨论】:

  • 问题不清楚,但我客人说你的函数返回字符串,但你试图返回用户。
  • @ThunderCat 修改了问题
  • 变量users 的类型为[]*User。该函数的返回类型是string。无法从函数返回用户,因为 []*User 不是 string。如果要返回字符串,则必须以某种方式将用户切片格式化为字符串。如果要返回一部分用户,请将User 类型声明移出函数,以便在函数的返回类型中使用。
  • @ThunderCat " 那么您必须以某种方式将用户切片格式化为字符串。"有什么建议吗?
  • @sibert 请edit your question 提供预期的输出。提示:您所指的仍然是数据结构。把签名改成Fetch(string)([]*User)怎么样?

标签: sql json database string go


【解决方案1】:

将此添加到您的代码中:

type userSlice []*User

func (us userSlice) String() string{
    var s []string
    for _, u := range us {
        if u != nil {
            s = append(s, fmt.Sprintf("%s %s", u.id, u.name))
        }
    }
    return strings.Join(s, "\n")
}

type User struct{
  id string
  name string
}

在您的 Fetch 函数中替换最后一个返回语句,如下所示:

func Fetch(query string) (string) {
  // Note that we declare the User type outside the function.
  rows, err := db.Query(query)

  users := make([]*User, 0)
  for rows.Next() {
    user := new(User)
    err := rows.Scan(&user.id, &user.name)
    users = append(users, user)
  }

  return(userSlice(users).String()) // Replace this line in your code
}

【讨论】:

    【解决方案2】:

    如果您必须返回一个字符串,您可以使用 encoding/json 包来序列化您的用户对象,但您必须使用以大写字母开头的字段才能导出。查看完整示例:

    import (
        "encoding/json"
    )
    
    func Fetch(query string) (string) {
    
        type User struct{
            Id string  // <-- CHANGED THIS LINE
            Name string // <-- CHANGED THIS LINE
        }
    
        rows, err := db.Query(query)
    
        users := make([]*User, 0)
        for rows.Next() {
          user := new(User)
          err := rows.Scan(&user.id, &user.name)
          users = append(users, user)
        }
    
        return(ToJSON(users)) // <-- CHANGED THIS LINE
    }
    
    func ToJSON(obj interface{}) (string) {
        res, err := json.Marshal(obj)
        if err != nil {
          panic("error with json serialization " + err.Error())
        }
        return string(res)
    }
    

    【讨论】:

    • 原始问题中没有提到 JSON。
    • @MarkusWMahlberg 他有能力阅读字里行间吗? :-)
    猜你喜欢
    • 1970-01-01
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多