如何在循环中将切片用作堆栈

时间:2016-05-17 23:39:45

标签: go slice

我正在使用切片作为堆栈。

当我这样做时

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)
}

结果是编译错误

  

未使用的变量' stack'

这让我很困惑。我想我可以使用:=,只要至少有一个变量被声明(在这种情况下是a),而stack只会被重新分配。但是我显然是错的。任何人都可以解释为什么这行

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

不会在循环中工作,我怎么做" pop"作为循环中的单行?

1 个答案:

答案 0 :(得分:3)

:=仅为现有变量分配新值,如果该变量在同一块中声明为并具有正确的类型。否则,它会创建一个新变量。由于你的循环是一个新的块,使用一个新的范围,你得到一个新的stack,然后从不用于任何东西。中途无法进入"中途"做一个:=,所以你不能在这里有一个单行。你必须

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

或者创建一个类型和一个方法(将堆栈作为指针接收器),这样就可以

a := stack.Pop()