为了账号安全,请及时绑定邮箱和手机立即绑定

在 Golang 中改变字符串?

在 Golang 中改变字符串?

Go
桃花长相依 2023-07-26 19:59:41
出于测试目的,我尝试模拟库中的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方法不知何故设法改变了字符串。
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

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。


查看完整回答
反对 回复 2023-07-26
  • 1 回答
  • 0 关注
  • 66 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信