为什么重新定义变量并不总是会触发错误?

时间:2016-04-29 12:39:00

标签: go

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

1 个答案:

答案 0 :(得分:3)

As described in Effective Go:=运算符,当左侧部分是名称列表时,声明尚未声明的名称列表。只有在声明了所有内容时才会引发错误。

在这种典型情况下,这一点特别方便:

a, err := someCall()
if (err) ...
b, err := someOtherCall()
if (err) ...

在文档术语中:

  

在:=声明中,即使已经存在,也可能出现变量v   已经宣布,提供:

     
      
  • 此声明与v的现有声明的范围相同   (如果v已在外部范围内声明,则声明将   创建一个新变量§),
  •   
  • 中的相应值   初始化可分配给v和
  •   
  • 至少还有一个   声明中的变量正在重新声明。
  •