将另一个 Golang 包的查询结果从结构转换为字符串



我已经在网上和 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"}

将此添加到您的代码中:

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
}

如果必须返回字符串,则可以使用 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)
}

最新更新