【问题标题】:Why doesn't foo := foo() result in an error?为什么 foo := foo() 不会导致错误?
【发布时间】:2019-09-19 16:03:02
【问题描述】:

我试图理解为什么在 Go 中以下代码不会产生错误。

func main() {
  foo := foo()
  fmt.Println(foo)
}

func foo() int {
  return 1 
}

Foo 已经在全局范围内定义了,为什么我可以重新定义它?

【问题讨论】:

标签: go syntax compiler-errors


【解决方案1】:

https://golang.org/ref/spec#Declarations_and_scope

在块中声明的标识符可以在内部重新声明 堵塞。虽然内部声明的标识符在范围内,但它 表示内部声明所声明的实体。

【讨论】:

    【解决方案2】:

    可以在内部块中重新声明标识符。如果同一标识符在同一块中声明两次,程序会产生错误。

    考虑这个例子来理解范围:

    package main
    import "fmt"
    var v="global"
    
    func main() {
    v := v
    fmt.Println(v)
    
    //v := v 
    //Error: Same identifier 'v' declared again
    
    {
    v := "inner"
    fmt.Println(v)  
    }
    fmt.Println(v)
    }
    

    程序的输出:

    global
    inner
    global
    

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2020-10-03
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多