Преобразовать результат запроса из структуры в строку для другого пакета Golang - PullRequest
0 голосов
/ 06 января 2019

Я искал решение в сети и в 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)
}

Я получаю эту ошибку при компиляции:

не может использовать пользователей (тип [] * Пользователь) в качестве строки типа в возвращаемом аргументе

Как мне сделать, чтобы получить правильное возвращаемое значение?

Ожидаемый ввод

JD Джон Доу --OR-- {id: "JD", имя: "Джон Доу"}

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Добавьте это к своему коду:

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 замените последний оператор return следующим образом:

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
}
0 голосов
/ 06 января 2019

Если вам нужно вернуть строку, вы можете использовать пакет 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...