登录
首页 >  Golang >  Go问答

这段代码什么时候覆盖了slice元素?

来源:stackoverflow

时间:2024-04-22 20:27:35 398浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《这段代码什么时候覆盖了slice元素?》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

在附加元素之前,我记录了每个元素。但结果看起来有些元素被覆盖了。

不知道什么时候被覆盖。

package main

import "fmt"

func main() {
    graph := [][]int{
        []int{3, 1},
        []int{4, 6, 7, 2, 5},
        []int{4, 6, 3},
        []int{6, 4},
        []int{7, 6, 5},
        []int{6},
        []int{7},
        []int{},
    }

    fmt.Println(allPathsSourceTarget(graph))
}

func allPathsSourceTarget(graph [][]int) [][]int {
    n := len(graph) - 1
    result := make([][]int, 0, 200)

    var pathRecord func(target, path []int)
    pathRecord = func(target, path []int) {
        if (len(target) == 0) && (path[len(path)-1] == n) {
            fmt.Println("insert into", path) // should end with 7
            result = append(result, path)
        }

        for _, v := range target {
            pathRecord(graph[v], append(path, v))
        }
    }

    for _, v := range graph[0] {
        pathRecord(graph[v], []int{0, v})
    }

    return result
}

结果中的每个元素都应以 7 结尾。


解决方案


您的问题与此行有关:

pathrecord(graph[v], append(path, v))

go 是如此“聪明”,所以他试图重用相同的切片分配的内存,而你实际上改变了已经添加到结果中的路径。 ):

试试这个:

newpath = make([]int, len(path))
copy(newpath, path)
pathrecord(graph[v], append(newpath, v))

这对我有用。我认为附加和切片很奇怪

我假设支持“此附加”的内存被传递到递归函数中,因为切片的作用类似于指针

然后下次它是相同的内存,因此它会被覆盖

因此,您需要在每次递归时获取副本以防止其覆盖

pathRecord = func(target, path []int) {
    if (len(target) == 0) && (path[len(path)-1] == n) {
        var c []int = make([]int, len(path))
        copy(c, path)
        //fmt.Println("insert into", payload) // should end with 7
        result = append(result, c)
    }

    for _, v := range target {
        pathRecord(graph[v], append(path, v)) //this append
    }
}

今天关于《这段代码什么时候覆盖了slice元素?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

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