Function 重新指定指针func参数
我试图重新分配一个指针,指向一个作为func参数传递的新值,但一旦我退出函数,指针又会有一个nil值 我已经仔细阅读了代码,它似乎一直在工作,直到我跳出函数进入调用函数,其中传递的指针仍然保持NIL值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 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
指针。或者你必须返回指针。我只是在做一些研究时意识到这一点。感谢您的快速帮助,我想我现在已经掌握了这个概念:)