Golang中将查询结果返回到另一个包的方法

Golang中将查询结果返回到另一个包的方法 我在网上和Stack Overflow上搜索过解决方案,但没找到适用于返回值的。这是一个简单的包含多行数据的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)
}

编译时出现以下错误:

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

我哪里做错了?


更多关于Golang中将查询结果返回到另一个包的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

7 回复

你这里仍然有 (string)

你应该让它看起来像这样:

func Fetch(query string) []*User {...

更多关于Golang中将查询结果返回到另一个包的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


type User struct{
    id string
    name string
}

func Fetch(query string,) []*User (string) {...

出现以下错误:

缺少函数体 语法错误:顶级声明后出现意外的 (

我个人会在返回后处理这个问题。

请查看标准 JSON 包,如果遇到任何问题或需要示例,请告诉我。😊

https://golang.org/pkg/encoding/json/

编辑:我仍然认为你应该仔细阅读 JSON 库,但如果你遇到困难,这里有一个示例:

https://play.golang.org/p/QGaAFvgTpZW

你好,

你试图返回一个类型为 User 的结构体切片,但函数定义中声明了返回一个字符串 (string)

你可能需要将你的 User 类型定义在函数外部,并让 Fetch 返回该类型。例如:

type User struct {
	id   string
	name string
}

func Fetch(query string) []*User {}

是的,这个方法有效。谢谢!

但我该如何将结果格式化为可读文本或 JSON:

%!s(*data.User=&{JD John Doe})

应该像这样(或者 JSON 格式)

JD John Doe

最好是在返回之前处理还是在返回之后处理?

另外,您还应该尽量返回每个错误,并在调用 Fetch 的地方处理它们。

以下是我通常编写您的获取函数的方式。(如果我已经知道要扫描什么内容,我个人可能不会传入查询参数,但这是另一个话题了)。

func Fetch(db *sql.DB, query string) ([]*User, error) {
    rows, err := db.Query(query)
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var users []*User
    for rows.Next() {
        var u User
        if err := rows.Scan(&u.ID, &u.Name); err != nil {
            return nil, err
        }
        users = append(users, &u)
    }
    if err := rows.Err(); err != nil {
        return nil, err
    }
    return users, nil
}

这个示例实际上无法运行,因为我没有初始化 db,仅作为示例参考。

问题在于函数声明的返回类型与实际返回的数据类型不匹配。你的函数声明返回 string 类型,但实际上返回的是 []*User 切片。

以下是正确的解决方案:

// 首先需要在包级别定义User结构体,以便其他包可以访问
// 在models包或共享包中定义
type User struct {
    ID   string
    Name string
}

// 在你的数据库操作包中
func Fetch(query string) ([]*User, error) {
    rows, err := db.Query(query)
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    users := make([]*User, 0)
    for rows.Next() {
        user := new(User)
        err := rows.Scan(&user.ID, &user.Name)
        if err != nil {
            return nil, err
        }
        users = append(users, user)
    }
    
    // 检查rows遍历过程中是否出现错误
    if err = rows.Err(); err != nil {
        return nil, err
    }
  
    return users, nil
}

然后在另一个包中调用:

// 在其他包中导入包含User结构体和Fetch函数的包
import "yourpackage/models"
import "yourpackage/database"

func main() {
    users, err := database.Fetch("SELECT id, name FROM users")
    if err != nil {
        log.Fatal(err)
    }
    
    for _, user := range users {
        fmt.Printf("ID: %s, Name: %s\n", user.ID, user.Name)
    }
}

主要修改点:

  1. 将返回类型从 string 改为 []*User
  2. 添加了错误处理并返回 error
  3. 将结构体字段改为导出字段(首字母大写)
  4. 在包级别定义结构体以便跨包使用
  5. 添加了必要的资源清理(defer rows.Close()

这样就能正确地将查询结果返回到另一个包了。

回到顶部