Function for copying arrays in Go language

huangapple go评论166阅读模式
英文:

Function for copying arrays in Go language

问题

Go语言中是否有用于将一个数组复制到另一个数组的内置函数?在处理二维(或更高维)数组时,这个方法是否适用?

英文:

Is there any built-in function in Go for copying one array to another?
Will this work in case of two (or more) dimensional arrays?

答案1

得分: 39

Go语言中有一个内置函数可以将一个数组复制到另一个数组中,它就是copy函数。下面是一个示例:

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

copy(a, b)

// a == []string{"goodbye", "world"}

对于二维(或更高维)数组,copy函数只会进行浅拷贝。下面是一个示例:

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和b看起来是一样的

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

// b的第二行不同,但a仍然是一样的

b[0][0] = "apple"

// 现在a看起来不同了

如果你想要进行多维数组的深拷贝,目前没有内置的函数可以直接实现。你可以手动进行深拷贝,下面是一个示例:

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)
    }
}

// 手动进行深拷贝
for i := range b {
    a[i] = make([]string, len(b[i]))
    copy(a[i], b[i])
}

b[0][0] = "apple"

// a仍然是一样的

需要注意的是,我假设你所说的"copy an array"是指"对切片进行深拷贝",因为数组可以使用=运算符进行深拷贝。

英文:

> Is there any built-in function in Go language for copying one array to another?

Yes: http://play.golang.org/p/_lYNw9SXN5

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

copy(a, b)

// a == []string{"goodbye", "world"}

> Will this work in case of two (or more) dimensional arrays?

copy will do a shallow copy of the rows: 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

I don't think there's a built-in for doing deep-copys of multi-dimensional arrays: you can do it manually like: 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

edit: As pointed out in the comments, I assumed by "copy an array" you meant "do a deep copy of a slice", as arrays can be deep-copied with the = operator as per jnml's answer (because arrays are value types): http://play.golang.org/p/8EuFqXnqPB

答案2

得分: 22

在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)
}

输出结果:

[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]]

Playground

英文:

The primary "function" for copying an array in Go is the assignment operator =, as it is the case for any other value of any other type.

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)
}

Playground


Output:

[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]]

答案3

得分: 10

使用copy函数将切片a的元素复制到数组b中。

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)

输出结果:

A: [1 2 3]
B: [0 0 0]
A: [1 2 3]
B2: [1 2 3]
A: [1 2 3]
B3: [1 9 3]
英文:

Use 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)

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]

huangapple
  • 本文由 发表于 2013年9月1日 23:19:32
  • 转载请务必保留本文链接:https://go.coder-hub.com/18559830.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定