Function 重新指定指针func参数

Function 重新指定指针func参数,function,pointers,go,Function,Pointers,Go,我试图重新分配一个指针,指向一个作为func参数传递的新值,但一旦我退出函数,指针又会有一个nil值 我已经仔细阅读了代码,它似乎一直在工作,直到我跳出函数进入调用函数,其中传递的指针仍然保持NIL值 func Prepare(db *sqlx.DB, stmt *sqlx.Stmt, query String) error { res,err := db.PreparexStatement(context.Background(), query) stmt = res

我试图重新分配一个指针,指向一个作为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
    }
}

我还是个新手,所以我相信我在这里没有掌握一个概念。任何帮助都将不胜感激。

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

如果要修改某些内容,必须传递其地址,并修改所指的值,例如:

func main() {
    var x int
    fmt.Println("before", x)
    set(&x)
    fmt.Println("after", x)
}

func set(i *int) {
    *i = 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
}
输出(在上尝试):

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

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
}
输出(在上尝试):


需要注意的一点是:您不能将
nil
指针传递给函数,而期望能够将任何内容分配给所指的值:
nil
指针不指向任何地方。您必须传递一个非
nil
指针,或者您也可以返回指针值(并在调用者处赋值)。

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

如果要修改某些内容,必须传递其地址,并修改所指的值,例如:

func main() {
    var x int
    fmt.Println("before", x)
    set(&x)
    fmt.Println("after", x)
}

func set(i *int) {
    *i = 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
}
输出(在上尝试):

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

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
}
输出(在上尝试):


需要注意的一点是:您不能将
nil
指针传递给函数,而期望能够将任何内容分配给所指的值:
nil
指针不指向任何地方。您必须传递一个非
nil
指针,或者您可以返回指针值(并在调用者处赋值)。

感谢您清除此问题,我假设指针将自动通过引用传递。我现在正在尝试使用
*stmt=*res
,但我得到了一个错误的内存地址,但我认为这个错误应该在其他地方查找?@P.Winz我也这么认为。但我甚至不知道您正在使用哪些软件包。主要是
github.com/jmoiron/sqlx
。我真正不明白的是:我传递了一个空的
sqlx.Stmt
指针到这个函数。我希望填充指针,而不是实际创建一个新指针
db.PreparexStatement()
将返回另一个
sqlx.Stmt
指针,因此我应该能够像这样设置值
*Stmt=res
,对吗?我已经检查了
PreparexStatement
函数的结果,它似乎返回了一个非常精细的指针,指向一个非常精细的结构。@P.Winz您不能传递
nil
指针,而期望将任何内容赋给所指的值:
nil
指针指向任何地方。为了能够在函数内设置定点值,您必须传递一个非
nil
指针。或者你必须返回指针。我只是在做一些研究时意识到这一点。谢谢你的快速帮助,我想我现在掌握了这个概念:)谢谢你澄清这一点,我假设指针会自动通过引用传递。我现在正在尝试使用
*stmt=*res
,但我得到了一个错误的内存地址,但我认为这个错误应该在其他地方查找?@P.Winz我也这么认为。但我甚至不知道您正在使用哪些软件包。主要是
github.com/jmoiron/sqlx
。我真正不明白的是:我传递了一个空的
sqlx.Stmt
指针到这个函数。我希望填充指针,而不是实际创建一个新指针
db.PreparexStatement()
将返回另一个
sqlx.Stmt
指针,因此我应该能够像这样设置值
*Stmt=res
,对吗?我已经检查了
PreparexStatement
函数的结果,它似乎返回了一个非常精细的指针,指向一个非常精细的结构。@P.Winz您不能传递
nil
指针,而期望将任何内容赋给所指的值:
nil
指针指向任何地方。为了能够在函数内设置定点值,您必须传递一个非
nil
指针。或者你必须返回指针。我只是在做一些研究时意识到这一点。感谢您的快速帮助,我想我现在已经掌握了这个概念:)