代码之家  ›  专栏  ›  技术社区  ›  sibert

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

  •  -2
  • sibert  · 技术社区  · 6 年前

    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)
    }
    

    我在编译时遇到此错误:

    如何获得正确的返回值?

    预期的输入是

    2 回复  |  直到 6 年前
        1
  •  1
  •   Qaisar Sardar    6 年前

    将此添加到您的代码中:

    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
    }
    

    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
  •  0
  •   Oswin Noetzelmann    6 年前

    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)
    }