Переназначение параметра func указателя - PullRequest
0 голосов
/ 18 января 2019

Я пытаюсь переназначить указатель на новое значение, которое было передано как параметр 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 голосов
/ 18 января 2019

Параметры действуют как локальные переменные внутри функции. Вы можете изменить их значения, но это только изменит значения локальных переменных. Они не зависят от переменных, значение которых вы передаете.

Если вы хотите что-то изменить, вы должны передать его адрес и изменить значение остроконечное , например ::

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, или в качестве альтернативы вы можете вернуть значение указателя (и назначить его вызывающей стороне).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...