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

我使用切片作为堆栈。


当我这样做时


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]

在循环中不起作用,我如何在循环中将“pop”作为单行执行?


慕妹3242003
浏览 194回答 1
1回答

慕桂英3389331

:=仅当变量在同一块中较早声明并且具有正确的类型时,才将新值分配给现有变量。否则,它会创建一个新变量。由于您的循环是一个新块,具有新的范围,因此您会得到一个 new stack,然后它永远不会用于任何事情。没有办法“中途”做 a :=,所以你根本不能在这里有一个单行。你必须var a inta, stack = stack[len(stack)-1], stack[:len(stack)-1]或者创建一个类型和一个方法(将堆栈作为指针接收器),以便您可以a := stack.Pop()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go