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

重新分配指针函数参数

重新分配指针函数参数

Go
凤凰求蛊 2023-06-01 17:10:39
我正在尝试将一个指针重新分配给一个作为 func 参数传递的新值,但是一旦我退出该函数,该指针再次具有 nil 值。我已经逐步完成了代码,它似乎一直有效,直到我退出函数进入调用函数,其中传递的指针仍然包含 NIL 值。func Prepare(db *sqlx.DB, stmt *sqlx.Stmt, query String) error {    res,err := db.PreparexStatement(context.Background(), query)    stmt = res    return err}我希望以下工作:func Boot(db *sqlx.DB, stmt *sqlx.Stmt, query String) {    err := Prepare(db, stmt, query)    if err != nil {        //handle    }}我对 GO 还是很陌生,所以我相信我在这里没有掌握一个概念。任何帮助将不胜感激。
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

参数充当函数内部的局部变量。您可以更改它们的值,但这只会更改局部变量的值。它们独立于您传递其值的变量。


如果你想修改一些东西,你必须传递它的地址,并修改指向的值,例如:


func main() {

    var x int

    fmt.Println("before", x)

    set(&x)

    fmt.Println("after", x)

}


func set(i *int) {

    *i = 2

}

输出(在Go Playground上尝试):


before 0

after 2

同样的事情也适用于指针变量:如果你想修改一个指针变量,你必须再次传递它的地址,并修改指向的值。在指针的情况下,类型将是指向指针的指针,例如:


func main() {

    var x *int

    x = new(int)

    fmt.Println("before", x, *x)

    set(&x)

    fmt.Println("after", x, *x)

}


func set(i **int) {

    p := new(int)

    *p = 2

    *i = p

}

输出(在Go Playground上尝试):


before 0x416020 0

after 0x416040 2

当然,如果你有一个指针变量并且不想只修改指向的值的指针值,你可以只传递指针,并修改指向的值:


func main() {

    var x *int

    x = new(int)

    fmt.Println("before", x, *x)

    set(x)

    fmt.Println("after", x, *x)

}


func set(i *int) {

    *i = 2

}

输出(在Go Playground上尝试):


before 0x416020 0

after 0x416020 2

需要注意的一件事:您不能将nil指针传递给函数并期望能够将任何东西分配给指向的值:nil指针指向无处。您必须传递一个非nil指针,或者作为替代方案,您可以返回指针值(并在调用者处分配)。


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

添加回答

举报

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