同学你好,这种写法主要是为了实现在支持可变长参数的Scan函数中,给入参赋值的作用。
先来看看Scan函数的定义(https://www.godoc.org/database/sql#Row.Scan):
func (r *Row) Scan(dest ...interface{}) error
dest就是需要传入的可变长参数,如果入参是*interface{}类型,这样就可以不经过类型转换将数据拷贝赋值到入参中。
所以在实际的使用Scan过程中,我们可以这样使用(示例):
// ...
var name string
err := rows.Scan(&name)
// ...
var id int
var name string
err = rows.Scan(&id, &name)
// ...
scanArgs := make([]interface{}, len(columns)) // 临时存储每一行数据
for index, _ := range scanArgs { // 为每列元素初始化一个指针
var tmp interface{}
scanArgs[index] = &tmp
}
err := rows.Scan(scanArgs...)
// ...
scanArgs := make([]interface{}, len(columns))
values := make([]interface{}, len(columns))
for j := range values {
scanArgs[j] = &values[j]
}
err := rows.Scan(scanArgs...)