Почему спортсмен Go объявлен и не используется, когда функция возвращает спортсмена?

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

Я помещаю операторы log.Printf, чтобы помочь отладить ошибку. Почему log.Printf не считается использованием переменной?

import (  
"github.com/gorilla/sessions"
)

func profileFromSession(r *http.Request) *workout.Athlete {

session, err := workout.SessionStore.Get(r, defaultSessionID)
log.Printf("$$$$$$$$$$$ session contains %#v", session)
if err != nil {
    log.Print("$$$$$$$$ error SessionStore.Get %s", err)
    return nil
}

// retrieve Athlete struct and type-assert it.
valAthlete := session.Values[currentAthleteKey]
var athlete = &workout.Athlete{}
log.Printf("before type check athlete is %T", athlete)

if athlete, ok := valAthlete.(*workout.Athlete); !ok {
    log.Print("athlete is not the correct Type")
}
log.Printf("profile athlete has %#s", athlete)

    return athlete
}

ОШИБКА 2019-07-26 22:00:32,931 instance_factory.py:243] Не удалось собрать приложение Go

/var/folders/mw/0y88j8_54bjc93d_lg3120qw0000gp/T/tmpAqfXoRappengine-go-bin/auth.go:265:33: спортсмен объявлен и не используется

Использование dev_appserver.py версии go1.11.2 darwin/amd64


person GolangNewb    schedule 26.07.2019    source источник
comment
Это переменная athlete, которую вы создаете в операторе if, которая не используется: if athlete, ok := .... Если он вам не нужен, используйте пустой идентификатор: if _, ok := ....   -  person icza    schedule 27.07.2019
comment
Значит, для проверки типа не нужна переменная для назначения?   -  person GolangNewb    schedule 27.07.2019
comment
Пустой идентификатор может заменить любую переменную в назначениях.   -  person icza    schedule 27.07.2019


Ответы (1)


Оператор := объявляет новую переменную. В частности, переменные, объявленные с использованием := в условии if, относятся только к соответствующим блокам if и else, а не к остальной части окружающей области.

Таким образом, у вас есть две разные переменные athlete: одна связана с функцией, а вторая связана с оператором if внутри этой функции.

Чтобы назначить переменную области действия функции вместо объявления новой локальной переменной, используйте = вместо :=. Для этого вам может понадобиться также объявить переменную ok перед этим назначением:

    var ok bool
    if athlete, ok = valAthlete.(*workout.Athlete); !ok {

См. также https://golang.org/issue/31064 и https://golang.org/issue/377.

person bcmills    schedule 29.07.2019