douduoyan5943 2016-05-17 23:39
浏览 34
已采纳

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

I am using a slice as a stack.

When I do this

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

I get the output

54321

as expected.

When I do this

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

I get the output

5 4

as expected. However, when I try to combine these by doing this

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

the result is a compile error

unused variable 'stack'

This confuses me. I thought I could use := as long as at least one of the variables is being declared (in this case a), and that stack would just get reassigned. However I am clearly wrong. Can anybody explain why the line

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

doesn't work in the loop, and how I can do "pop" as a one-liner in a loop?

  • 写回答

1条回答 默认 最新

  • doubomudichen0832 2016-05-17 23:46
    关注

    := only assigns a new value to an existing variable if the variable was declared earlier in the same block and has the correct type. Otherwise, it creates a new variable. Since your loop is a new block, with a new scope, you get a new stack, which is then never used for anything. There's no way to "halfway" do a :=, so you simply can't have a one-liner here. You'll have to

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

    or else create a type and a method (with the stack as a pointer receiver) so that you can

    a := stack.Pop()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?