2015-11-01 3 views
2

Это пример из GOPL - «выражения x [i] и x +« A »-« a »относятся к объявлению x из внешнего блока, мы объясним это в момент."go variable scope и shadowing

Объяснение никогда не приходит. Почему x [i] ссылается на x во внешней области? Как только вы обновите x во внутреннем блоке, он должен затенять x во внешнем блоке. Почему это работает?

package main 

import "fmt" 

func main() { 
    x := "hello!" 
    for i := 0; i < len(x); i++ { 
     x := x[i] 
     if x != '!' { 
      x := x + 'A' - 'a' 
      fmt.Printf("%c", x) 
     } 
    } 
} 

http://play.golang.org/p/NQxfkTeGzA

ответ

4

:= оператор создает новую переменную и присваивает правой части значения к нему.

В первой итерации для цикла, на этапе x := x[i], единственный x правая сторона видит это x определяется на этапе x := "hello!". Насколько правая сторона видит, x еще не обновлен.

Как только вы переобъявить х во внутреннем блоке ..

Это является еще нет. Его обьявляется только после x := x[i].

И в конце итерации заканчивается новая область x. Он не используется повторно в новой итерации.

Когда новая итерация происходит снова и снова.

+1

А так каждая итерация цикла является новой областью. http://stackoverflow.com/questions/7880658/what-is-the-scope-of-a-while-and-for-loop – VM7