我是Go的新手,我已经偶然发现了几次以下问题。我不明白在:=
的帮助下允许(或不允许)重新定义一个变量的基本规则是什么。
您能否向我解释为什么test := func3()
会在第一个脚本中触发错误但在第二个脚本中正常工作?
两个脚本之间唯一的变化是调用func3()
的行的位置。
谢谢!
https://play.golang.org/p/vvCI7nxHZL
package main
import (
"fmt"
)
func func1() (string, string) {
return "", ""
}
func func2() (string, string) {
return "", ""
}
func func3() string {
return ""
}
func main() {
test, test2 := func1()
test, test3 := func2()
test := func3()
fmt.Println(test, test2, test3)
}
https://play.golang.org/p/BTTYCGEJ4E
package main
import (
"fmt"
)
func func1() (string, string) {
return "", ""
}
func func2() (string, string) {
return "", ""
}
func func3() string {
return ""
}
func main() {
test := func3()
test, test2 := func1()
test, test3 := func2()
fmt.Println(test, test2, test3)
}
答案 0 :(得分:3)
As described in Effective Go,:=
运算符,当左侧部分是名称列表时,声明尚未声明的名称列表。只有在声明了所有内容时才会引发错误。
在这种典型情况下,这一点特别方便:
a, err := someCall()
if (err) ...
b, err := someOtherCall()
if (err) ...
在文档术语中:
在:=声明中,即使已经存在,也可能出现变量v 已经宣布,提供:
- 此声明与v的现有声明的范围相同 (如果v已在外部范围内声明,则声明将 创建一个新变量§),
- 中的相应值 初始化可分配给v和
- 至少还有一个 声明中的变量正在重新声明。