2016-05-17 45 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) 
} 

的結果結合起來是一個編譯錯誤

未使用的變量「堆」

這混淆了我。只要至少有一個變量正在被聲明(在這種情況下爲a),並且stack將被重新分配,我想我可以使用:=。不過,我顯然是錯的。任何人都可以解釋爲什麼線

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

在迴路不工作,我該怎麼辦「流行」在一個循環一行程序?

回答

3

:=如果該變量在同一個塊之前聲明的並且具有正確的類型,則僅向現有變量分配新值。否則,它會創建一個新變量。由於你的循環是一個新的程序塊,並且有一個新的作用域,你會得到一個新的stack,然後它不會用於任何事情。沒有辦法「半路」做一個:=,所以你根本無法在這裏做一行。你必須

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

或者創建一個類型和方法(與堆棧指針接收器),讓您可以

a := stack.Pop() 
相關問題