我正在使用声明的变量返回一个结构。为什么编译器说我不使用声明的变量?
我放置了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
答案 0 :(得分:0)
:=
语句声明一个 new 变量。特别是,在:=
条件下使用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。