重新分配指针函数参数

时间:2019-01-18 12:56:08

标签: 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还是很陌生,所以我认为我无法在这里掌握一个概念。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

参数充当函数内部的局部变量。您可以更改它们的值,但这只会更改局部变量的值。它们与您传递值的变量无关。

如果要修改某些内容,则必须传递其地址,然后修改指向的值,例如:

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