本文是用于Golang 1.6, 2016-5-3版本的 https://github.com/go-sql-driver/mysql
在使用Go进行MySQL操作时,发现两个有些疑惑的问题。
DB
或者 Tx
对象的 QueryRow
并不会像其他接口会立即返回 error
,它只会返回一个 *Row
对象,然后通过调用 Row.Scan
才会知道是否有错误。问题就是,调用 Scan
需要准备数据(比如声明一大堆变量或者初始化一个对象),而如果出现错误(没有结果的话也算错误,会返回 sql.ErrNoRows
),这些数据是完全没必要的。
调用 DB
或者 Tx
对象的 Query
后返回的 Rows
对象只能通过 Next
来逐步抽取每个结果,无法提前知道 Rows
的长度(不考虑使用SQL中的 COUNT
语句),这样的话收集数据往往需要一直调用 append
来不停地把数据追加到Slice内,当长度大于Slice的Capacity时, append
必然要进行重新的内存分配以及元素的复制操作,如果能提前知道长度当然最好。