2016-05-17 7 views
0

スライスをスタックとして使用しています。スライスをループ内のスタックとして使用する方法

私はこの

stack := make([]int, 0) 
stack = append(stack, 1, 2, 3, 4, 5) 
for len(stack) != 0 { 
    var a int 
    a, stack = stack[len(stack) - 1], stack[:len(stack) - 1] 
    fmt.Print(a) 
} 

を行うと、予想通り、私は出力

54321 

を取得します。

私はこの

stack := make([]int, 0) 
stack = append(stack, 1, 2, 3, 4, 5) 
a, stack := stack[len(stack) - 1], stack[:len(stack) - 1] 
fmt.Println(a, len(stack)) 

を行うと、予想通り、私は出力

5 4 

を取得します。私はこの

stack := make([]int, 0) 
stack = append(stack, 1, 2, 3, 4, 5) 
for len(stack) != 0 { 
    a, stack := stack[len(stack) - 1], stack[:len(stack) - 1] 
    fmt.Print(a) 
} 

結果を実行して、これらを組み合わせることをしようとすると、しかし、これは私を混乱させるコンパイルエラー

未使用の変数「スタック」

です。私は:=を、少なくとも1つの変数が宣言されている限り(この場合はa)、stackが再割り当てされる限り、使用できると考えました。しかし、私は明らかに間違っています。誰も説明できますなぜライン

a, stack := stack[len(stack) - 1], stack[:len(stack) - 1] 

ループでは動作しません、と私は、ループ内のワンライナーとして「ポップ」を行うことができますどのように?変数は、以前同じブロックで宣言され、正しいタイプを有していた場合

答えて

3

:=は、既存の変数に新しい値を割り当てます。それ以外の場合は、新しい変数を作成します。あなたのループは新しいブロックで、新しいスコープを持っているので、新しいstackが得られます。これは決して何のためにも使われません。 :=を「中途半端に」実行する方法はないので、ここでは1つのライナーを持つことはできません。あなたは

var a int 
a, stack = stack[len(stack)-1], stack[:len(stack)-1] 

に持っているか、または他のタイプと(ポインタ受信機としてスタックを持つ)メソッドを作成しますようにすることができます

a := stack.Pop() 
関連する問題