0

我有一段代码在使用时会出错,:=但是当我使用=它时会正确编译。我学到的是:=只需要定义至少一个变量,其他的不需要定义,但是考虑到这段代码是 Go 中的一个错误吗?

无法编译的代码:

错误:services/db_service.go:16:会话已声明但未使用

package services

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

const DB = "mmdb_dev"

var Session *mgo.Session

func InitMongo() bool {
    url := "mongodb://localhost"
    log.Println("Establishing MongoDB connection...")
    //var err error
    Session, err := mgo.Dial(url)
    if err != nil {
        log.Fatal("Cannot connect to MongoDB!")
        return true
    } else {
        return false
    }
}

func GetNewSession() mgo.Session {
    return *Session.Copy()
}

编译代码

package services

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

const DB = "mmdb_dev"

var Session *mgo.Session

func InitMongo() bool {
    url := "mongodb://localhost"
    log.Println("Establishing MongoDB connection...")
    var err error
    Session, err = mgo.Dial(url)
    if err != nil {
        log.Fatal("Cannot connect to MongoDB!")
        return true
    } else {
        return false
    }
}

func GetNewSession() mgo.Session {
    return *Session.Copy()
}

变化是

Session, err := mgo.Dial(url) 

var err error
Session, err = mgo.Dial(url)
4

3 回答 3

4

运算符:=用于短变量声明。它声明并初始化变量。

在您的第一个示例中,您已经Session在全局范围内声明了变量,并且在main函数中您已经在主范围内声明了一个具有相同名称的新变量(因为您使用了:=运算符)。因此,Session在全局范围内声明的变量未使用,因此出现错误。

在您的第二个示例中,您使用赋值运算符为全局变量分配了一个值=,因此它不是声明一个新Session变量,而是为现有的全局变量分配一个值。

请找到一个显示全局变量和局部变量之间差异的示例。

于 2017-07-14T03:35:39.123 回答
2

你正在隐藏你的 Session 变量。您的第一个示例是创建一个新的 Session 变量,现在它不会编译 b/c 另一个已声明但未使用。

于 2017-07-14T02:23:51.730 回答
0

当你使用:=变量定义是在函数内部。即变量的范围改变了,从全局到局部。而且您没有在本地使用变量,因此会出现编译错误。

于 2017-07-14T08:27:26.547 回答