为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕妹3242003 2022-01-10 17:02:14
我使用切片作为堆栈。当我这样做时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”作为单行执行?
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

:=仅当变量在同一块中较早声明并且具有正确的类型时,才将新值分配给现有变量。否则,它会创建一个新变量。由于您的循环是一个新块,具有新的范围,因此您会得到一个 new stack,然后它永远不会用于任何事情。没有办法“中途”做 a :=,所以你根本不能在这里有一个单行。你必须


var a int

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

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


a := stack.Pop()


查看完整回答
反对 回复 2022-01-10
  • 1 回答
  • 0 关注
  • 169 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信