登录
首页 >  Golang >  Go问答

在Go中创建浮动切片的副本

来源:stackoverflow

时间:2024-02-27 16:06:26 420浏览 收藏

本篇文章给大家分享《在Go中创建浮动切片的副本》,覆盖了Golang的常见基础知识,其实一个语言的全部知识点一篇文章是不可能说完的,但希望通过这些问题,让读者对自己的掌握程度有一定的认识(B 数),从而弥补自己的不足,更好的掌握它。

问题内容

我想在go中克隆一个[][]float64 slice而不影响原始数组。我该怎么做?

在下面的示例中,我希望切片 a1a2 更改时保持不受影响。目前我使用的是go内置的append函数。但我一直无法获得所需的功能。

package main

import (
    "fmt"
)

func main() {
    a1 := [][]float64{[]float64{1.0,1.0}, []float64{2.0,2.1}}   
    a2 := make([][]float64, len(a1))
    
    a2 = append([][]float64{}, a1...)
    fmt.println(a2, a1) // at this step, a1 has not changed.
    
    a2[1][0] = 5.0 //change value of one element of a2.
    
    fmt.println(a2, a1) // at this step, a1 has changed.
}

>> [[1 1] [2 2.1]] [[1 1] [2 2.1]]
>> [[1 1] [5 2.1]] [[1 1] [5 2.1]]

当我使用go的复制功能时,我发现它支持int数据类型。当我使用复制功能时,出现以下错误。可以理解的是,下面的错误是因为 go 中的副本期望的类型不匹配。

cannot use copy(a2, a1) (type int) as type [][]float64 in assignment

我想使用切片而不是数组。

我正在使用这个参考。我是 go 新手,非常感谢任何帮助。


正确答案


多维切片是切片的切片。如果是使用循环的 2d 切片,则必须单独克隆每个切片。

类似这样的事情:

package main

import (
    "fmt"
)

func clone(arr [][]float64) (res [][]float64) {
    res = make([][]float64, len(arr))
    for i := range arr {
        res[i] = append([]float64{}, arr[i]...)
    }
    return
}

func main() {
    a1 := [][]float64{{1.0, 1.0}, {2.0, 2.1}}
    a2 := clone(a1)

    fmt.println(a2, a1) // at this step, a1 has not changed.

    a2[1][0] = 5.0 //change value of one element of a2.

    fmt.println(a2, a1)
}

打印

[[1 1] [2 2.1]] [[1 1] [2 2.1]]
[[1 1] [5 2.1]] [[1 1] [2 2.1]]

您可以使用 range 方法迭代 2d 切片,在循环内创建一个与内部切片长度相同的临时切片并将其分配给目标切片索引,之后您可以使用 copy 方法。这里是具有相同逻辑的代码:

package main

import (
    "fmt"
)

func main() {
    a1 := [][]float64{[]float64{1.0, 1.0}, []float64{2.0, 2.1}}

    a3 := make([][]float64, len(a1))

    copyslice(a3, a1)

    fmt.println(a3, a1)
    a3[1][0] = 10.0
    fmt.println(a3, a1)
}

func copyslice(dest [][]float64, src [][]float64) {

    for i := range src {

        tmp := make([]float64, len(src[i]))

        dest[i] = tmp
        copy(dest[i], src[i])

    }

    return

}

输出:

[[1 1] [2 2.1]] [[1 1] [2 2.1]]
[[1 1] [10 2.1]] [[1 1] [2 2.1]]

好了,本文到此结束,带大家了解了《在Go中创建浮动切片的副本》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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