在 Golang 中改变字符串?

出于测试目的,我尝试模拟库中的Rows.Scan方法database/sql。签名看起来像这样:

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

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

var name stringrows.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)
}

结果是:

0xc0000129500xc0000129500xc0000129600xc000012950

我的初始字符串永远不会呈现新值。我知道字符串是不可变的(尽管我对这个概念的真正理解有点动摇),但实际的Rows.Scan方法不知何故设法改变了字符串。


桃花长相依
浏览 86回答 1
1回答

ITMISS

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)}请注意,如果我们在&s1调用之前和之后在 main 中打印,它仍然不会改变。它仍然是相同的变量,仍然位于相同的地址。我们已将一个指针传递&s1给MockScan,以便MockScan可以使用该指针将值写入s1。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go