defer rows.Close(),容易使连接数得不到释放,或defer堆栈过多,导致内存占用过多。sql.DB对象,否则会频繁打开和关闭对db的tcp连接,导致延时,以及过多的TIME-WAIT。db.QueryRow()和Scan()应该在同一个链中使用。fmt.Sprintf来避免参数绑定和prepare statements。Scan(),它会在内部来帮你自动进行类型转换。database/sql的功能来处理连接池,重连和重试逻辑,而不是显式编写逻辑。rows.Next()可能会非正常退出,如果没有在内部检查错误,需要在rows.Next()结束后用rows.Err()来捕获rows里存放的错误。db.Exec()。sql.Tx或者同一个连接对象。sql.Tx对象绑定了一个事务,而db则不是,这时候可能不会得到想要的结果。sql.NullXXX的变量中。Query(),Exec()的参数,并且它的高位不为0,会抛出一个错误。References: