函数返回运动员时,为什么Go会“声明并不使用运动员”?

时间:2019-07-26 22:23:57

标签: go gorilla

我正在使用声明的变量返回一个结构。为什么编译器说我不使用声明的变量?

我放置了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 go版本go1.11.2 darwin / amd64

1 个答案:

答案 0 :(得分:0)

:=语句声明一个 new 变量。特别是,在:=条件下使用if声明的变量的作用域仅作用于相应的ifelse块,而不是其余的周围作用域。

因此,您在其中有两个不同的athlete变量:一个变量作用于该函数,第二个变量作用于该函数中的if语句。

要分配给功能范围的变量而不是声明新的局部变量,请使用=而不是:=。为此,您可能还需要在该分配之前声明ok变量:

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

另请参阅https://golang.org/issue/31064https://golang.org/issue/377