使用:=给出未使用的错误,但在Go中使用= don

时间:2017-07-14 02:18:48

标签: mongodb go compiler-errors mgo go-gin

我有一段代码,当我使用:=时出现错误,但是当我使用=时,它会正确编译。我学到的是:=只需要定义至少一个变量,不需要定义其他变量,但考虑到这个代码是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)

3 个答案:

答案 0 :(得分:4)

运营商:=用于short variable declaration。它声明并初始化变量。

在您的第一个示例中,您已在全局范围内声明了Session变量,并且在main函数中,您已在主范围内声明了一个具有相同名称的新变量(正如您所使用的那样{ {1}}运营商)。因此,在全局范围中声明的:=变量未使用,因此是错误。

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

请找到显示全局变量和本地变量之间差异的example

答案 1 :(得分:2)

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

答案 2 :(得分:0)

使用:=时,变量定义在函数内。即变量的 范围 已从全局更改为本地。并且您不在本地使用变量,因此编译错误。