I have piece of code in which I get error when I use :=
but when I use =
it compiles properly. What I learned is that :=
only requires only atleast one variable to be defined, others need not be defined, but considering this code is it a bug in Go?
Uncompilable code:
Error: services/db_service.go:16: Session declared and not used
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()
}
Compiled code
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()
}
The change is
Session, err := mgo.Dial(url)
to
var err error
Session, err = mgo.Dial(url)
The operator
:=
is used for short variable declaration. It declares and initializes the variable.In your first example, you have declared
Session
variable in global scope and inmain
function you've declared a new variable having same name in the main scope (as you have used:=
operator). Therefore, theSession
variable declared in the global scope is unused and hence the error.In your second example, you have assigned global variable a value using assignment operator
=
and hence it is not declaring a newSession
variable but assigning a value to existing global variable.Please find an example showing difference between global and local variable.
When you use
:=
the variable definition is within the function. i.e. the scope of the variable changed, from global to local. And you're not using variable locally, hence the compilation error.You are shadowing your Session variable. Your first example is creating a new Session variable and now it won't compile b/c the other is declared but unused.