我使用切片作为堆栈。当我这样做时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()
- 1 回答
- 0 关注
- 169 浏览
添加回答
举报
0/150
提交
取消