2016-08-04 6 views
2

documenation状態:結果としてGo:forループ内で新しい変数が作成されたときの複数変数の短い再宣言?

、再宣言は多変数の短い宣言に表示されます。 再宣言では新しい変数が導入されません。元のに新しい値を割り当てます。

しかし、これはforループでどのように機能しますか? See this example。ループ外のスコープを持つ変数 "nextPos"は、実際には内部スコープのループ内で再宣言され、各繰り返しごとにその値が失われるようです。しかし、Thisのバージョンは動作します。

+0

Goは(Javascriptを、たとえば、とは違って)ブロック・スコープを持っています。変数を宣言すると、変数はその周辺ブロックの中で宣言されます。ネストしたブロックを持つことができるので、内側のブロック内の同じ名前の変数を外側に宣言することができます。これはシャドーイングと呼ばれます。 – thwd

答えて

2

レッツ・ショー:

package main 

import "fmt" 

func main() { 
    a := 100 
    { 
     fmt.Println(a) // 100 
     a, b := 0, 0 
     fmt.Println(a, b) // 0 0 
    } 
    fmt.Println(a) // 100 
} 

出力:

100 
0 0 
100 

のは、あなたの最初のサンプルを単純化してみましょう、このワーキングサンプルコード(1)を参照してください従ってaa, b := 0, 0であり、これはであり、このaは新しい変数である
これは可変スコープとシャドウイングと呼ばれ、
とします。今までのため、このコードのようcは、それがどのように動作するかを示して(2):

100 
0 0 
100 

とあなたの次のサンプル・コード(3)を簡素化することができます:

package main 

import "fmt" 

func main() { 
    a := 100 
    { 
     fmt.Println(a) // 100 
     c, b := 0, 0 
     fmt.Println(c, b) // 0 0 
    } 
    fmt.Println(a) // 100 
} 

出力は、(1)のように同じです。

package main 

import "fmt" 

func main() { 
    a := 0 
    b := byte(0) 
    { 
     fmt.Println(a, b) // 0 0 
     a, b = 1, byte(1) 
     fmt.Println(a, b) // 1 1 
    } 
    fmt.Println(a, b) // 1 1 
} 

出力:

0 0 
1 1 
1 1 

ここにabは同じ内側と外側のループです。 Where can we use Variable Scoping and Shadowing in Go?
をして参照してください:

も見 What is the difference between := and = in Go?

+1

ありがとうございます。これはドキュメントからは分かりませんでした – sebdehne

1

これは、短い割り当てステートメント:=の仕組みです。スペックから:通常の変数宣言とは異なり

、短い変数の宣言は 再宣言変数は、と(ブロックが機能 体である場合、またはパラメータリスト)彼らはもともと以前 同じブロック内で宣言された提供可能同じタイプであり、少なくとも1つの非ブランク変数 は新しいものです。その結果、再宣言は、 複数変数の短い宣言にしか現れません。再宣言では、新しい変数 が導入されません。オリジナルに新しい値を割り当てます。

このように、あなたの最初の例では、1つの新しい変数、すなわちnextBがあることがわかりますし、この各ループ反復のためにもnextPosを再宣言しています。

nextBnextPosの両方が既に宣言されているため、再宣言は行われません。コンパイラが同じ理由で:=を許可しない、つまり新しい変数が宣言されていないため、=を使用していることにも注意してください。それはこれらのコードサンプルで、どのように動作するか

関連する問題