Почему переменная равна нулю, хотя я положил туда ссылку на объект

Я не могу понять, почему после звонка ConnectToMongo переменная session все еще ноль. Я бы понял если ConnectToMongo принимает не ссылочный тип, как ConnectToMongo(session mgo.Session) но тип ссылочной переменной *mgo.Session должен быть сохранен после возврата функции ConnectToMongo

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
)

func ConnectToMongo(session *mgo.Session) {
    if session == nil {
        var err error
        session, err = mgo.Dial("localhost:27028")
        if err != nil {
            panic(err)
        }
    }
}

func main() {
    var session *mgo.Session
    ConnectToMongo(session)
    if session == nil {
        fmt.Println("nil. Why?")
    }
}

Это выводит:

nil. Why?

Обновить

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
)

func ConnectToMongo(session **mgo.Session) {
    if session == nil {
        var err error
        *session, err = mgo.Dial("localhost:27028")
        if err != nil {
            panic(err)
        }
    }
}

func main() {
    var session *mgo.Session
    ConnectToMongo(&session)
    if session == nil {
        fmt.Println("nil. Why?")
    } else {
        fmt.Println("not nil. Ok.")
    }
}

Тот же вывод:

nil. Why?

1 ответ

Решение

Вам нужно передать указатель на указатель, чтобы сохранить значение указателя. В противном случае вы копируете значение указателя на ConnectToMongo функция.

package main

import (
    "fmt"
    "gopkg.in/mgo.v2"
)

func ConnectToMongo(session **mgo.Session) {
    if *session == nil {
        var err error
        *session, err = mgo.Dial("localhost:27028")
        if err != nil {
            panic(err)
        }
    }
}

func main() {
    var session *mgo.Session
    ConnectToMongo(&session)
    if session == nil {
        fmt.Println("nil. Why?")
    }
}
Другие вопросы по тегам