为什么变量为零虽然我把对象引用

时间:2015-01-16 02:10:06

标签: go mgo

我无法弄清楚为什么在调用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 个答案:

答案 0 :(得分:2)

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