登录
首页 >  Golang >  Go问答

最后一个元素替换 Go 切片元素

来源:stackoverflow

时间:2024-03-21 21:45:30 187浏览 收藏

本文讨论了在 Go 语言中使用切片元素替换最后一个元素时出现的问题。当尝试用以下代码替换最后一个元素时,预期结果为 [1 1 2 2],但实际结果却变成了 [1 1 2 3]: ```go tmp := set[:] ``` 该代码不会复制切片,而是重新使用了原始切片,导致元素在下一个循环中发生变化。为了解决这个问题,可以使用以下代码复制切片: ```go tmp := append([]int(nil), set...) ```

问题内容

我的问题是答案应该是[1 1 2 2],但它却是[1 1 2 3]。 我调试了这段代码,发现在该循环中,[1 1 2 2]首先被附加到数组中,但在下一个循环中它变成了[1 1 2 3]。 我不明白为什么,以“d”开头的日志,该数组中的元素在下一个循环中发生了变化。 这是我的代码: https://play.golang.org/p/x_cu8glmoqf

package main

import (
    "fmt"
)

func main() {
    nums := []int{1, 1, 2, 2, 3}
    result := subsetswithdup(nums)
    fmt.println(result)
}

func subsetswithdup(nums []int) [][]int {
    result := [][]int{{}, nums}
    for i := 0; i < len(nums); i++ {
        if i > 0 && nums[i] == nums[i-1] {
            continue
        }
        for j := 1; j < len(nums); j++ {
            result = append(result, dsf(nums, []int{nums[i]}, i+1, j)...)
        }
    }
    return result
}

func dsf(nums []int, set []int, start int, length int) [][]int {
    result := [][]int{}
    if len(set) == length {
        return append(result, set)
    }
    for i := start; i < len(nums); i++ {
        if i != start && nums[i] == nums[i-1] {
            continue
        }
        if len(set) == 3 {
            fmt.printf("a %v %p\n", result, &result)
        }
        tmp := set[:]
        tmp = append(tmp, nums[i])
        if len(set) == 3 {
            fmt.printf("b %v %p %v %p\n", tmp, &tmp, result, &result)
        }
        result = append(result, dsf(nums, tmp, i+1, length)...)
        if len(tmp) == 4 {
            fmt.printf("c %v %p %v %p\n", tmp, &tmp, result, &result)
            for _, r := range result {
                fmt.printf("d %v %p\n", r, &r)
            }
        }
    }
    return result
}
A [] 0xc000004960
B [1 1 2 2] 0xc0000049c0 [] 0xc000004960
C [1 1 2 2] 0xc0000049c0 [[1 1 2 2]] 0xc000004960
D [1 1 2 2] 0xc000004ae0
A [[1 1 2 2]] 0xc000004960
B [1 1 2 3] 0xc000004b60 [[1 1 2 3]] 0xc000004960
C [1 1 2 3] 0xc000004b60 [[1 1 2 3] [1 1 2 3]] 0xc000004960
D [1 1 2 3] 0xc000004ca0
D [1 1 2 3] 0xc000004ca0
A [] 0xc000004da0
B [1 2 2 3] 0xc000004de0 [] 0xc000004da0
C [1 2 2 3] 0xc000004de0 [[1 2 2 3]] 0xc000004da0
D [1 2 2 3] 0xc000004f00

解决方案


您正在尝试使用以下方式复制切片:

tmp := set[:]

这不会复制切片,而是重新使用原始切片。与 tmp := set 效果相同。您可以使用:

tmp := append([]int(nil), set...)

如果你喜欢的话。 Here 是经过此更改的程序,所有额外的调试都被注释掉。

今天关于《最后一个元素替换 Go 切片元素》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>