用Go语言复制数组的功能

ang*_*her 20 arrays go

Go中是否有任何内置函数可以将一个数组复制到另一个数组?这是否适用于两个(或更多)维数组?

Ale*_*lec 27

Go语言中是否有用于将一个数组复制到另一个数组的内置函数?

是的:http://play.golang.org/p/_lYNw9SXN5

a := []string{
    "hello",
    "world",
}
b := []string{
    "goodbye",
    "world",
}

copy(a, b)

// a == []string{"goodbye", "world"}
Run Code Online (Sandbox Code Playgroud)

这是否适用于两个(或更多)维数组?

copy将做一个浅的行副本:http://play.golang.org/p/0gPk6P1VWh

a := make([][]string, 10)

b := make([][]string, 10)
for i := range b {
    b[i] = make([]string, 10)
    for j := range b[i] {
        b[i][j] = strconv.Itoa(i + j)
    }
}

copy(a, b)

// a and b look the same

b[1] = []string{"some", "new", "data"}

// b's second row is different; a still looks the same

b[0][0] = "apple"

// now a looks different
Run Code Online (Sandbox Code Playgroud)

我认为没有内置的多维数组深度复制:你可以手动完成:http://play.golang.org/p/nlVJq-ehzC

a := make([][]string, 10)

b := make([][]string, 10)
for i := range b {
    b[i] = make([]string, 10)
    for j := range b[i] {
        b[i][j] = strconv.Itoa(i + j)
    }
}

// manual deep copy
for i := range b {
    a[i] = make([]string, len(b[i]))
    copy(a[i], b[i])
}

b[0][0] = "apple"

// a still looks the same
Run Code Online (Sandbox Code Playgroud)

编辑:正如评论中所指出的,我假设"复制一个数组"你的意思是"做一个切片的深层复制",因为数组可以=根据jnml的答案与运算符进行深度复制(因为数组是值类型) :http://play.golang.org/p/8EuFqXnqPB

  • 您已经回答了这个问题:"Go语言中是否有用于将一个切片复制到另一个切片的内置函数?" 这可能是OP实际想要的,但你应该解释数组和切片之间的区别. (7认同)

zzz*_*zzz 16

在Go中复制数组的主要"函数"是赋值运算符=,因为任何其他类型的任何其他值都是如此.

package main

import "fmt"

func main() {
        var a, b [4]int
        a[2] = 42
        b = a
        fmt.Println(a, b)

        // 2D array
        var c, d [3][5]int
        c[1][2] = 314
        d = c
        fmt.Println(c)
        fmt.Println(d)
}
Run Code Online (Sandbox Code Playgroud)

操场


输出:

[0 0 42 0] [0 0 42 0]
[[0 0 0 0 0] [0 0 314 0 0] [0 0 0 0 0]]
[[0 0 0 0 0] [0 0 314 0 0] [0 0 0 0 0]]
Run Code Online (Sandbox Code Playgroud)

  • @ErikAigner分配一个数组将复制整个数组,就像它是一个结构一样.这与C不同.要创建数组指针,必须使用"&"显式获取地址. (4认同)
  • 如果您使用的是实际的数组(不是使用 `make()` 创建的数组,那么赋值工作得很好。但是,如果您正在处理切片(我可以看到有些人会因差异而感到困惑),那么您'您需要显式地使用“copy()”,否则您将拥有一个带有指针的引用类型,从而导致问题。 (3认同)

Eri*_*ner 8

使用copy http://play.golang.org/p/t7P6IliMOK

a := []int{1, 2, 3}
var b [3]int

fmt.Println("A:", a)
fmt.Println("B:", b)

copy(b[:], a)

fmt.Println("A:", a)
fmt.Println("B2:", b)

b[1] = 9

fmt.Println("A:", a)
fmt.Println("B3:", b)
Run Code Online (Sandbox Code Playgroud)

OUT:

A: [1 2 3]
B: [0 0 0]
A: [1 2 3]
B2: [1 2 3]
A: [1 2 3]
B3: [1 9 3]
Run Code Online (Sandbox Code Playgroud)