Почему переменная равна нулю, хотя я положил туда ссылку на объект
Я не могу понять, почему после звонка 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?")
}
}