这是golang编译器问题还是我理解错了

TonoT · 2021-02-01 20:42:44 · 1256 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-02-01 20:42:44 的主题,其中的信息可能已经有所发展或是发生改变。

golang上提了两次issue直接被秒关,大佬们看看这段代码的输出能不能符合你们的预期,是编译器问题吗

func main() {
    subsets([]int{9, 0, 3, 5, 7})
}
func subsets(nums []int) (res [][]int) {
    res = append(res, []int{})
    for _, v := range nums {
        for _, r := range res {
            s := append(r, v)
            res = append(res, s)
        }
    }
    return
}

我的在遍历到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]]
[]
[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]

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1256 次点击  
加入收藏 微博
14 回复  |  直到 2021-02-03 15:29:54
jarlyyn
jarlyyn · #1 · 4年之前
        s := append(r, v)

你需要了解下append的用法……

jarlyyn
jarlyyn · #2 · 4年之前

再看了下代码,你还需要知道slice到底是什么,和array的关系

TonoT
TonoT · #3 · 4年之前
jarlyynjarlyyn #2 回复

再看了下代码,你还需要知道slice到底是什么,和array的关系

嗯,我知道原因了,我以为forrange会重新分配变量的,这个地方我在理解一下

jarlyyn
jarlyyn · #4 · 4年之前
TonoTTonoT #3 回复

#2楼 @jarlyyn 嗯,我知道原因了,我以为forrange会重新分配变量的,这个地方我在理解一下

....

问题不在for range啊

slice本身是个模拟出来的类型。

它代表的是array的一部分,array中指定的一块。

大概是 slice所属的array,slice对应的开始下标,slice对应的结束下标

cap本质就是array的最大范围

append做的是将slice 的下标向后移动若干位并插入数据。

如果cap不足(array不够大),那么就创建一个一个新的array,并将slice所属的array/下开始下标/结束下标转过去。

所以,append正常情况下,只能将append的值设到append的第一个参数上。不然一旦发生数据迁移,就会出问题。

jiuker
jiuker · #5 · 4年之前

range 是一开始就决定了range 多少次的,不会管你啥变量

focusonline
focusonline · #6 · 4年之前
jiukerjiuker #5 回复

range 是一开始就决定了range 多少次的,不会管你啥变量

楼上已经解释很清楚了, 和range没关系. 怎么还扯range... 还是机器人回答帖子AI的算法需要提高一下了.

jiuker
jiuker · #7 · 4年之前
focusonlinefocusonline #6 回复

#5楼 @jiuker 楼上已经解释很清楚了, 和range没关系. 怎么还扯range... 还是机器人回答帖子AI的算法需要提高一下了.

这样说,学习了,大佬,那怎么定义cap不足,array不够大呢

focusonline
focusonline · #8 · 4年之前
jiukerjiuker #7 回复

#6楼 @focusonline 这样说,学习了,大佬,那怎么定义cap不足,array不够大呢

哦 原来是真人, 我觉得没必要考虑那么多cap不足啥的, 会自动扩容的

jarlyyn
jarlyyn · #9 · 4年之前
jiukerjiuker #7 回复

#6楼 @focusonline 这样说,学习了,大佬,那怎么定义cap不足,array不够大呢

make slice的时候可以指定cap

make([]byte,5,10) 这样。

不然就会自动扩容,记得是每次不足扩容一倍。

jiuker
jiuker · #10 · 4年之前
jarlyynjarlyyn #9 回复

#7楼 @jiuker make slice的时候可以指定cap make([]byte,5,10) 这样。 不然就会自动扩容,记得是每次不足扩容一倍。

容量超过2048也是扩一倍么

jarlyyn
jarlyyn · #11 · 4年之前
jiukerjiuker #10 回复

#9楼 @jarlyyn 容量超过2048也是扩一倍么

https://www.jianshu.com/p/54be5b08a21c

扩容多少并没有写在spec里,这个应该是看具体实现的。

zhanghaoliang
zhanghaoliang · #12 · 4年之前

能具体解释一下吗 扩容之后呢 为啥会多个7

TonoT
TonoT · #13 · 4年之前
zhanghaoliangzhanghaoliang #12 回复

能具体解释一下吗 扩容之后呢 为啥会多个7

就这个问题,我做了一些总结,https://studygolang.com/articles/33108?fr=sidebar

zhanghaoliang
zhanghaoliang · #14 · 4年之前
TonoTTonoT #13 回复

#12楼 @zhanghaoliang 就这个问题,我做了一些总结,https://studygolang.com/articles/33108?fr=sidebar

看到了 能睡个好觉了 多谢

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传