首页 > 解决方案 > 在传递指向切片的指针时出现意外行为

问题描述

下面的 go 程序应该生成一个整数切片的所有排列:

package main
import "fmt"

func permute(nums []int) [][]int {
    var res [][]int
    var s []int
    permuteHlp(&res, nums, 0, s)
    return res
}

func permuteHlp(res *[][]int, nums []int, i int, s []int) {
    if i == len(nums) {
        *res = append(*res, s)
        return
    }

    for j := i; j < len(nums); j++ {
        s = append(s, nums[j])
        nums[i], nums[j] = nums[j], nums[i]
        permuteHlp(res, nums, i+1, s)
        s = s[:len(s)-1]
        nums[i], nums[j] = nums[j], nums[i]
    }
}

func main() {
    x := []int{1,2,3,4}
    y := permute(x)

    fmt.Println(y)
}

输出出乎意料

[[1 2 4 3] [1 2 4 3] [1 3 4 2] [1 3 4 2] [1 4 2 3] [1 4 2 3] [2 1 4 3] [2 1 4 3] [2 3 4 1] [2 3 4 1] [2 4 1 3] [2 4 1 3] [3 2 4 1] [3 2 4 1] [3 1 4 2] [3 1 4 2] [3 4 2 1] [3 4 2 1] [4 2 1 3] [4 2 1 3] [4 3 1 2] [4 3 1 2] [4 1 2 3] [4 1 2 3]]

我不明白这里有什么问题。我将不胜感激任何帮助。谢谢!

标签: go

解决方案


您正在传递指向同一切片的指针。最后你会在结果中得到一堆指向同一个切片的指针,所以当然所有的值都是相同的——它是一遍又一遍地打印的同一个切片。

还值得注意的是,指向切片的指针很少是您想要的,因为切片已经包含指向底层数组的指针。


推荐阅读