根据给定的最大帖子数量,一次从数据库里面获取多篇帖子,是一种非常常见的做法。换句话说,程序可以通过执行以下命令,从数据库里面获取前十篇帖子,并将它们放入到一个切片里面:
posts, _ := Posts(10)
代码清单6-12展示了完成这一操作的Posts
函数的具体定义。
代码清单6-12 一次获取多篇帖子
func Posts(limit int) (posts []Post, err error) {
rows, err := Db.Query("select id, content, author from posts limit $1", limit)
if err != nil {
return
}
for rows.Next() {
post := Post{}
err = rows.Scan(&post.Id, &post.Content, &post.Author)
if err != nil {
return
}
posts = append(posts, post)
}
rows.Close()
return
}
Posts
函数使用了sql.DB
结构的Query
方法来执行查询,这个方法会返回一个Rows
接口。Rows
接口是一个迭代器,程序可以通过重复调用它的Next
方法来对其进行迭代并获得相应的sql.Row
;当所有行都被迭代完毕时,Next
方法将返回io.EOF
作为结果。
Posts
函数在每次进行迭代的时候都会创建一个Post
结构,并将行包含的数据扫描到结构里面,然后再将这个结构追加到posts
切片的末尾。当所有行都被迭代完毕之后,Posts
函数就会将这个包含了多个Post
结构的posts
切片返回给调用者。