为什么foo:= foo()不会导致错误?

时间:2019-09-19 16:03:02

标签: go syntax compiler-errors

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

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

func foo() int {
  return 1 
}

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

2 个答案:

答案 0 :(得分:3)

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

  

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

答案 1 :(得分:0)

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

请考虑以下示例以了解范围:

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