function - 重新分配指针函数参数

标签 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
    return err
}

我希望以下内容有效:

func Boot(db *sqlx.DB, stmt *sqlx.Stmt, query String) {
    err := Prepare(db, stmt, query)
    if err != nil {
        //handle
    }
}

我对 GO 还是很陌生,所以我相信我没有掌握这里的概念。任何帮助将不胜感激。

最佳答案

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

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

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 指针,或者作为替代方案,您可以返回指针值(并在调用者处分配它)。

关于function - 重新分配指针函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54254475/

相关文章:

C 通过引用字符串传递

C 命令行参数

objective-c - 不知道为什么出现 "EXC Bad Access"错误

go - 一个结构体的单向链表的初始化

c - 函数中的参数太少

javascript - 将多个处理程序绑定(bind)到元素

PHP - 在函数内定义类

c - 如何知道指针数组中指针的长度是多少?

go - 复杂字符串格式验证

go - 从 go channel 流中读取