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

最佳答案

As described in Effective Go:=运算符,当左边是一个名称列表时,将声明尚未声明的名称。仅当已全部声明时,才会引发错误。

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

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

在文档方面:

关于go - 为什么重新定义变量并不总是会触发错误?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36938575/

10-10 23:57