出于测试目的,我试图从库中模拟Rows.Scan方法。database/sql签名如下所示:
func (r *Rows) Scan(dest ...interface{}) error
如何使用它的许多示例表明,您将指向字符串的指针(例如)传递给 Scan 方法,它将通过指针分配值。
var name string
rows.Scan(&name)
我一直在尝试重新创建类似的东西以供我自己理解并最终用于模拟,但它不起作用。
func MockScan(args ...interface{}) {
var s2 string
fmt.Println(args[0])
args[0] = &s2
fmt.Println(args[0])
}
func main() {
var s1 string
fmt.Println(&s1)
MockScan(&s1)
fmt.Println(&s1)
}
结果是:
0xc000012950
0xc000012950
0xc000012960
0xc000012950
我的初始字符串永远不会采用它的新值。我知道字符串是不可变的(尽管我对这个概念的真正理解有点摇摆不定)但是实际Rows.Scan方法设法改变了字符串。