【发布时间】:2016-03-19 21:25:27
【问题描述】:
考虑以下说明问题的示例(它只是为了解释问题而构建的,但我在书中以及在实际项目中看到了类似的代码):
package main
import (
"strconv"
"fmt"
"log"
)
func main() {
n1, err := strconv.Atoi("1")
if err != nil {
log.Panicf("%v", err)
}
n2, err := strconv.Atoi("2")
if err != nil {
log.Panicf("%v", err)
}
// err := fmt.Errorf("new error") <- line 1
// n1, err := strconv.Atoi("3") <- line 2
fmt.Printf("n1 = %d, n2 = %d\n", n1, n2)
}
编译器不会抱怨重新定义err,但如果我取消注释<- line 1 或<- line 2,它会抱怨no new variable on left side of :=。
那么,它是如何工作的?为什么编译器允许在多返回语句中覆盖 err,使用 :=,而不是 <- line 2 示例中的 n1?
如果您能指出解释此行为的官方参考资料会更好。
【问题讨论】:
-
嗯,我差不多写完了gopl.io(虽然重点是数据类型、方法、接口、并发),并且阅读了有效的go,以及其他资源(虽然通常是我当下感兴趣的话题) ,我用 Go 进行算法比赛,以及构建 CLI 工具。我的意思是阅读文档是一件好事,但构建事物和构建学习语言的同时要好得多,对我来说,这是一种平衡,在学习时间与构建(获得结果)事物之间的时间。尤其是当您开始学习一门新语言时,您希望看到结果以继续学习。
-
当我谈到 CLI 时,我的意思是使用 crypto/ssh/net/http/base64/yaml 和其他包,以及 go-bindata :),就像总体概述一样 :)跨度>
-
但是,感谢您在有效的 go doc 中提及这一点。