有关Golang Slice的提问

来源:3-3 切片的操作

慕数据6821453

2018-09-11

老师 你好, 我有关一个在写代码中的问题

我先上代码:

//简单的说下 代码的作用就是 返回所有的子集
func Tianyun_Subsets(nums []int) [][]int {
	result:=make([][]int,0)
	result=append(result,[]int{})
	for i:=0;i<len(nums);i++{
		length:=len(result)
        for j:=0;j<length;j++{
          result = append(result,append(result[j],nums[i]))
		}
	}
   return result
}

//这里是我的 Test case
import (
	"testing"
	"fmt"
)

func TestTianyun_Subsets(t *testing.T) {
	fmt.Println(Tianyun_Subsets([]int{9,0,3,5,7})
}

好了 这道题的正常的输出 应该是这样的:
[[] [9] [0] [9 0] [3] [9 3] [0 3] [9 0 3] [5] [9 5] [0 5] [9 0 5] [3 5] [9 3 5] [0 3 5] [9 0 3 5] [7] [9 7] [0 7] [9 0 7] [3 7] [9 3 7] [0 3 7] [9 0 3 7] [5 7] [9 5 7] [0 5 7] [9 0 5 7] [3 5 7] [9 3 5 7] [0 3 5 7] [9 0 3 5 7]]

然鹅 我的输出是:
[[] [9] [0] [9 0] [3] [9 3] [0 3] [9 0 3] [5] [9 5] [0 5] [9 0 5] [3 5] [9 3 5] [0 3 5] [9 0 3 7] [7] [9 7] [0 7] [9 0 7] [3 7] [9 3 7] [0 3 7] [9 0 3 7] [5 7] [9 5 7] [0 5 7] [9 0 5 7] [3 5 7] [9 3 5 7] [0 3 5 7] [9 0 3 7 7]]

我发现的问题在于 有一个重复的 9 0 3 7 按照我的思路 不应该出现这种情况 然后我 debug 了一下 发现了一个比较神奇的地方 也就是我不懂的地方:

图片描述
就是我打圈的地方,本来 9 0 3 5的数值 被改成了 9 0 3 7 导致后面 执行的时候 出现了错误

老师可以回答下 这个是什么原因吗? 拜托了,然后可以指出 哪里写错了吗??
我个人感觉是 append 那里 slice 拓展的原因
谢谢

写回答

1回答

ccmouse

2018-09-18

对,的确是slice扩展的原因。请参考我这里讲到的slice append的工作原理。slice只是下面数据的一个视图,修改slice会造成对下面数据的修改。

我改了一下,我们需要强制拷贝出来,这样可以

result = append(result,
  append(
     append([]int{}, result[j]...),
     nums[i]))

0
0

Google资深工程师深度讲解Go语言 由浅入深掌握Go语言

语法+分布式爬虫实战 为转型工程师量身打造

5995 学习 · 1909 问题

查看课程