Почему foo: = foo () не приводит к ошибке? - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь понять, почему в Go следующий код не выдает ошибку.

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

func foo() int {
  return 1 
}

Foo уже определен в глобальной области видимости, почему я могу переопределить его?

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019

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

Идентификатор, объявленный в блоке, может быть повторно объявлен во внутреннем блоке.Пока идентификатор внутренней декларации находится в области видимости, он обозначает сущность, объявленную внутренней декларацией.

0 голосов
/ 19 сентября 2019

Возможно переопределить идентификатор во внутреннем блоке. Программа выдает ошибку, если один и тот же идентификатор объявлен дважды в одном и том же блоке.

Рассмотрим этот пример для понимания области действия:

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
...