В целях тестирования я пытаюсь смоделировать метод 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
удается изменить строку.