我有一段代码,当我使用:=
时出现错误,但是当我使用=
时,它会正确编译。我学到的是:=
只需要定义至少一个变量,不需要定义其他变量,但考虑到这个代码是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)
答案 0 :(得分:4)
运营商:=
用于short variable declaration。它声明并初始化变量。
在您的第一个示例中,您已在全局范围内声明了Session
变量,并且在main
函数中,您已在主范围内声明了一个具有相同名称的新变量(正如您所使用的那样{ {1}}运营商)。因此,在全局范围中声明的:=
变量未使用,因此是错误。
在第二个示例中,您使用赋值运算符Session
为全局变量赋值,因此它不会声明新的=
变量,而是为现有的全局变量赋值。
请找到显示全局变量和本地变量之间差异的example。
答案 1 :(得分:2)
您正在遮蔽您的Session变量。你的第一个例子是创建一个新的Session变量,现在它不会编译b / c,另一个被声明但未使用。
答案 2 :(得分:0)
使用:=
时,变量定义在函数内。即变量的 范围 已从全局更改为本地。并且您不在本地使用变量,因此编译错误。