gpt4 book ai didi

go - 短变量声明和 "variable declared and not used"错误

转载 作者:IT王子 更新时间:2023-10-29 01:48:47 26 4
gpt4 key购买 nike

我偶然发现了一个奇怪的问题,即下面的代码无法编译:

func main() {
var val reflect.Value
var tm time.Time

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))
}

出现错误(代码是 linter 推荐的):

$ go run main.go
# command-line-arguments
./main.go:13:5: tm declared and not used

请注意确实使用了 tm 变量。

但是如果我添加一个 else block - 一切都按预期编译:

func main() {
var val reflect.Value
var tm time.Time

if tm, err := time.Parse(time.RFC3339, "2018-09-11T17:50:54.247Z"); err != nil {
panic(err)
} else {
val = reflect.ValueOf(tm)
}

fmt.Println(val, tm, reflect.TypeOf(tm))
}

这看起来像是编译器中的错误或者可能是已知问题?任何想法? (我正在使用 go 1.11)

编辑:到目前为止的所有回复者。根据:https://golang.org/ref/spec#Short_variable_declarations

Unlike regular variable declarations, a short variable declaration may redeclare variables provided they were originally declared earlier in the same block (or the parameter lists if the block is the function body) with the same type, and at least one of the non-blank variables is new. As a consequence, redeclaration can only appear in a multi-variable short declaration. Redeclaration does not introduce a new variable; it just assigns a new value to the original.

最佳答案

这部分:

if tm, err := time.Parse(...)

创建一个变量tm,它的作用域只在if语句中——它不是你声明为var的那个tm time.Time.

此新变量未在 if 中使用,因此会出现错误。请注意,您也没有分配外层 tm,因此 fmt.Println 将打印零时间,而不是 time.Parse 返回的时间。

解决这个问题:声明 err 并将您的 if 更改为:

var err error
if tm, err = time.Parse(...)

注意这是 GO 中的微妙之处,也是相当常见的错误来源。 := 语句实际上可以与已经声明的变量和一个或多个 变量混合使用 - 如果已经声明的变量在 相同的词法作用域。然后,:= 只自动声明新的,其余的只是分配(与 = 一样)。但是,如果您在新作用域中使用 :=,则所有变量都在该作用域中声明,并屏蔽任何具有相同名称的外部作用域变量(例如在 if;请注意 if 条件不在大括号内,但仍被视为在 {code} block 内;同样的情况也发生在 for 和 GO 中的其他复合语句)。

关于go - 短变量声明和 "variable declared and not used"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52281767/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com