【问题标题】:Why redefining a variable does not always trigger an error?为什么重新定义变量并不总是会触发错误?
【发布时间】:2016-04-29 21:05:53
【问题描述】:

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

【问题讨论】:

    标签: go


    【解决方案1】:

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

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

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

    在文档条款中:

    在 := 声明中,变量 v 可能会出现,即使它已经 已声明,提供:

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

    【讨论】:

    • 嗯,这真是太快了!终于明白了,谢谢!
    • 我会告诉你,在函数内部使用循环和使用 := 时,你必须格外小心范围。举个例子:play.golang.org/p/KGTcJ2xm00。两次都是完全相同的循环,除了第二次提前定义了 err,所以我们不必在循环中使用 := 来定义 err。
    猜你喜欢
    • 2019-08-16
    • 2017-07-04
    • 2011-04-14
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    相关资源
    最近更新 更多