【发布时间】:2019-05-24 20:36:28
【问题描述】:
我刚刚开始使用 golang,我正在尝试从 Postgres users 表中读取几行并将结果存储为对行建模的 User 结构数组。
type User struct {
Id int
Title string
}
func Find_users(db *sql.DB) {
// Query the DB
rows, err := db.Query(`SELECT u.id, u.title FROM users u;`)
if err != nil { log.Fatal(err) }
// Initialize array slice of all users. What size do I use here?
// I don't know the number of results beforehand
var users = make([]User, ????)
// Loop through each result record, creating a User struct for each row
defer rows.Close()
for i := 0; rows.Next(); i++ {
err := rows.Scan(&id, &title)
if err != nil { log.Fatal(err) }
log.Println(id, title)
users[i] = User{Id: id, Title: title}
}
// .... do stuff
}
如您所见,我的问题是我想预先初始化一个数组或切片来存储所有数据库记录,但我不知道提前会有多少记录。
我正在权衡几种不同的方法,并想找出以下哪些方法在 golang 社区中最常用 -
事先创建一个非常大的数组(例如 10,000 个元素)。好像很浪费
事先明确计算行数。这可能有效,但我需要运行 2 个查询 - 一个用于计数,一个用于获取结果。如果我的查询很复杂(此处未显示),那就是在 2 个地方重复该逻辑。或者,我可以两次运行相同的查询,但首先遍历它并计算行数。这一切都会奏效,但它似乎不干净。
我见过扩展切片的示例。我不太了解切片,无法在这里进行调整。另外,如果我不断地将切片扩展 10k 次,那肯定看起来很浪费。
谢谢!
【问题讨论】:
标签: postgresql go