использование := дает неиспользуемую ошибку, но использование = не в Go

У меня есть фрагмент кода, в котором я получаю сообщение об ошибке, когда использую :=, но когда я использую =, он компилируется правильно. Что я узнал, так это то, что := требует определения только одной переменной, другие не должны быть определены, но, учитывая этот код, является ли это ошибкой в ​​​​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) 

to

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

person Nidhin David    schedule 14.07.2017    source источник


Ответы (3)


Оператор := используется для краткого объявления переменной. Он объявляет и инициализирует переменную.

В первом примере вы объявили переменную Session в глобальной области, а в функции main вы объявили новую переменную с тем же именем в основной области (поскольку вы использовали оператор :=). Следовательно, переменная Session, объявленная в глобальной области видимости, не используется и, следовательно, ошибка.

Во втором примере вы присвоили глобальной переменной значение с помощью оператора присваивания = и, следовательно, не объявляете новую переменную Session, а присваиваете значение существующей глобальной переменной.

Найдите пример, показывающий разницу между глобальной и локальной переменной.

person sahaj    schedule 14.07.2017

Вы затеняете свою переменную Session. В вашем первом примере создается новая переменная Session, и теперь она не будет компилироваться, потому что другая объявлена, но не используется.

person Community    schedule 14.07.2017

Когда вы используете :=, определение переменной находится внутри функции. то есть область переменной изменилась с глобальной на локальную. И вы не используете переменную локально, отсюда и ошибка компиляции.

person KBN    schedule 14.07.2017