在学会如何创建帖子之后,我们很自然地就要学习如何获取帖子了。跟前面一样,在编写获取帖子的函数之前,我们需要先了解一下获取帖子的具体步骤。因为程序在尝试获取帖子的时候是没有现成的Post
结构可用的,所以它自然也无法通过为Post
结构定义方法来获取帖子了。为此,程序需要定义一个GetPost
函数,这个函数接受帖子的Id
作为参数,并返回一个包含了完整帖子数据的Post
结构作为结果:
readPost, _ := GetPost(1)
fmt.Println(readPost)//① {1 Hello World! Sau Sheong}
这段代码没有像之前展示过的代码清单那样,向GetPost
函数传递post.Id
变量,而是直接向GetPost
函数传递了帖子的ID
值1
,以此来强调函数是通过帖子ID来获取帖子的。代码清单6-9展示了GetPost
函数的具体实现代码。
代码清单6-9 获取一篇帖子
func GetPost(id int) (post Post, err error) {
post = Post{}
err = Db.QueryRow("select id, content, author from posts where id = $1", id)
.Scan(&post.Id, &post.Content, &post.Author)
return
}
GetPost
函数首先创建了一个空的Post
结构,然后在对结构进行设置之后,将其用作函数的返回值:
post = Post{}
跟之前一样,程序通过串联QueryRow
方法和Scan
方法,将执行查询所得的数据复制到空的Post
结构里面。需要注意的是,因为获取单个帖子无需重复执行相同的SQL语句,所以程序使用的是sql.DB
结构的QueryRow
方法而不是sql.Stmt
结构的QueryRow
方法。实际上,Create
方法和GetPost
函数既可以使用sql.DB
来实现,也可以使用sql.Stmt
来实现,在这里使用sql.DB
而不是沿用sql.Stmt
只是为了展示另一种可行的做法。
在将数据库包含的数据填充到空的Post
结构之后,GetPost
就会将这个结构返回给调用函数。