关于golang的sql驱动程序,下面两个语句有什么区别?
// store.DB is *sql.DB type
rows, err := store.DB.Query(SQL, args ...)
// err != nil
defer rows.Close()
Run Code Online (Sandbox Code Playgroud)
和
// store.DB is *sql.DB type
stmt, err := store.DB.Prepare(SQL)
// err != nil
defer stmt.Close()
rows, err := stmt.Query(args ...)
// err != nil
defer rows.Close()
Run Code Online (Sandbox Code Playgroud)
看来他们是一样的?有什么微妙的区别吗?
更新:
我们不需要执行很多stmt.Exec或stmt.Query之后db.Prepare,只需要执行一次exec或query在每次之后执行prepare.当我们使用db.Queryor时db.Exec,我们将参数传递给方法而不是使用原始SQL字符串(出于安全考虑).
我找到了一个参考链接:http://go-database-sql.org/prepared.html
似乎两种方式都使用预处理语句,有什么区别?
我r.(flate.Reader)在golang的zlib/reader.go文件中找到了很多代码片段.这是什么意思?
https://golang.org/src/compress/zlib/reader.go
func (z *reader) Reset(r io.Reader, dict []byte) error {
if fr, ok := r.(flate.Reader); ok {
z.r = fr
} else {
z.r = bufio.NewReader(r)
}
// more code omitted ...
}
Run Code Online (Sandbox Code Playgroud)
PS的源代码io和flate.
io:https:
//golang.org/src/io/io.go flate:https://golang.org/src/compress/flate/inflate.go