2016-05-17 44 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()