我正在使用切片作为堆栈。
当我这样做时
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)
}
结果是编译错误
未使用的变量' stack'
这让我很困惑。我想我可以使用:=
,只要至少有一个变量被声明(在这种情况下是a
),而stack
只会被重新分配。但是我显然是错的。任何人都可以解释为什么这行
a, stack := stack[len(stack) - 1], stack[:len(stack) - 1]
不会在循环中工作,我怎么做" pop"作为循环中的单行?
答案 0 :(得分:3)
:=
仅为现有变量分配新值,如果该变量在同一块中声明为并具有正确的类型。否则,它会创建一个新变量。由于你的循环是一个新的块,使用一个新的范围,你得到一个新的stack
,然后从不用于任何东西。中途无法进入"中途"做一个:=
,所以你不能在这里有一个单行。你必须
var a int
a, stack = stack[len(stack)-1], stack[:len(stack)-1]
或者创建一个类型和一个方法(将堆栈作为指针接收器),这样就可以
a := stack.Pop()