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()
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)
  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟