本文是用于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 必然要进行重新的内存分配以及元素的复制操作,如果能提前知道长度当然最好。