为什么变量是零,尽管我把对象的引用放在那里

why variable is nil although I put there reference to object

我不明白为什么在调用 ConnectToMongo 之后变量 session 仍然是零。我会理解如果 ConnectToMongo 不接受像 ConnectToMongo(session mgo.Session) 这样的引用类型,但是在返回函数 ConnectToMongo

之后必须保存引用变量类型 *mgo.Session
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?

您需要传递一个指向指针的指针来存储指针的值。否则,您正在将指针的值复制到 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?")
    }
}