2 回答
TA贡献1811条经验 获得超6个赞
这部分:
if tm, err := time.Parse(...)
创建一个仅在语句内具有范围的新变量- 它不是您声明为的变量。tm
if
var tm time.Time
此新变量未在 中使用if
,因此会出现错误。请注意,您也没有tm
分配外部级别,因此fmt.Println
将打印零时间,而不是 time.Parse 返回的时间。
要解决此问题:声明err
并更改if
为:
var err errorif tm, err = time.Parse(...)
注意这是 GO 中的一个微妙的事情,也是一个相当常见的错误来源。该:=
语句实际上可以与已经声明的变量和一个或多个新变量的混合使用 - 如果已经声明的变量在相同的词法范围内。然后,只有新的由自动声明:=
,其余的只是分配(与=
)。但是,如果您在新范围内使用:=
,则所有变量都在该范围内声明,并屏蔽任何具有相同名称的外部范围变量(例如在 ;if
注意条件if
不在大括号内,但仍被视为如果它在块内; GO 中的{code}
the 和其他复合语句也会发生同样的情况)。for
TA贡献1752条经验 获得超4个赞
您的if
语句声明了一个新变量tm
,该变量仅存在于if
块的范围内并且确实从未使用过:
if tm, err := time.Parse(time.RFC3339, "2018-09-11T17:50:54.247Z"); err != nil { panic(err) }
在 Go 中,:=
声明一个新变量并对其进行初始化。你的意思可能是:
func main() {
var val reflect.Value
var tm time.Time
var err error
// Note the change to normal assignment here instead of :=
if tm, err = time.Parse(time.RFC3339, "2018-09-11T17:50:54.247Z"); err != nil {
panic(err)
}
val = reflect.ValueOf(tm)
fmt.Println(val, tm, reflect.TypeOf(tm))
}
shortcut运算符在Go Tour of Go:=
中进行了演示,并在Go spec中进行了解释,后者包括:
它是带有初始化表达式但没有类型的常规变量声明的简写:
"var" IdentifierList = ExpressionList .
Go 规范中也解释了作用域。
- 2 回答
- 0 关注
- 128 浏览
添加回答
举报