gpt4 book ai didi

string - 突变Golang中的字符串?

转载 作者:行者123 更新时间:2023-12-01 21:16:17 25 4
gpt4 key购买 nike

为了进行测试,我试图从database/sql库中模拟Rows.Scan方法。签名如下所示:

func (r *Rows) Scan(dest ...interface{}) error

如何使用此功能的许多示例表明,您将指针(例如)传递给了Scan方法的字符串,它将通过该指针分配值。

var name string
rows.Scan(&name)

我一直在尝试为自己的理解并最终为了 mock 而重新创建类似的东西,但是它不起作用。
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方法设法将字符串突变了。

最佳答案

args[0] = &s2
这在MockScan之外没有任何作用。您正在更改args[0]指向的内容,而不是在更改args[0]指向的内容。

你想做类似的事情

func MockScan(args ...interface{}) {
// In real life, there would be some logic here to figure out what
// kind of pointer we're dealing with, or some error handling to
// handle the case where the user didn't pass a *string
dst := args[0].(*string)
*dst = "A new value"
}

func main() {
var s1 string = "An old value"
fmt.Println(s1)
MockScan(&s1)
fmt.Println(s1)
}

请注意,如果我们在调用之前和之后在main中打印 &s1,它仍然不会改变。它仍然是相同的变量,仍位于相同的地址。我们已经将 &s1指针传递给 MockScan,以便 MockScan可以使用该指针将值写入 s1

关于string - 突变Golang中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58307302/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com