用Go语言复制数组的功能

Go中是否有用于将一个数组复制到另一个数组的内置函数?
如果有两个,该功能是否可以使用? (或更多)维数组?</ p>
</ div>

展开原文

原文

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?

douxin8749
douxin8749 陷阱:数组和切片看起来很相似,行为不同。数组按值划分,切片按引用划分(简化)。
3 年多之前 回复

3个回答




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

是: http://play.golang.org/p/_lYNw9SXN5 </ p>

  a:= [] string {
“ hello”,
“ world”,
}
b:= [] string {
“再见”,

“ world”,
}

copy(a,b)

// a == [] string {“ goodbye”,“ world”}
</ code> </ pre> \ n



在二维(或更多)维数组的情况下是否可以使用?</ p>
</ blockquote>

< code> copy </ code>将对行进行浅表复制: http://play.golang.org/p/0gPk6P1VWh < / a> </ p>

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

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

}

copy(a,b)

// a和b看起来相同

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

// b的第二行 是不同的; 一个看起来还是一样

b [0] [0] =“ apple”

//现在看起来又不同了
</ code> </ pre>

我没有 认为有内置的方法可以对多维数组进行深度复制:您可以手动进行操作,例如: http:// play.golang.org/p/nlVJq-ehzC </ p>

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

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

//手动深度复制
for i:=范围b {
a [i] = make([] string,len(b [i] ))
copy(a [i],b [i])
}

b [0] [0] =“ apple”

//看起来还是一样
</ code> </ pre>

编辑:正如评论中指出的那样,我假设“复制数组”是指“进行切片的深层复制”,因为数组可以用<进行深层复制。 按照jnml的答案的code> = </ code>运算符(因为数组是值类型): http://play.golang.org/ p / 8EuFqXnqPB </ p>
</ div>

展开原文

原文

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

dow46218
dow46218 您已经回答了以下问题:“ Go语言中是否有用于将一个切片复制到另一个切片的内置函数?” 这可能是OP真正想要的,但是您应该解释一下数组和切片之间的区别。
大约 7 年之前 回复
drl971115
drl971115 非常感谢。 它帮助了
大约 7 年之前 回复



在Go中复制数组的主要“功能”是赋值运算符= ,就像其他任何类型的其他值一样。</ p>

 包main 

import” fmt“

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

// 2D数组
var c,d [3] [5] int
c [1] [2] = 314
d = c
fmt.Println(c)
fmt.Println(d)
}
</ code> < / pre>

游乐场 </ p>


输出:</ p>

  [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]]
</ code> </ pre>
</ div>

展开原文

原文

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

dongwen7730
dongwen7730 如果您使用的是实际数组(不是使用make()创建的数组),则赋值可以很好地进行;但是,如果您正在处理切片(我可以看到其中的某些差别会混淆它们),那么您将需要 显式复制(),否则您将拥有带有导致问题的指针的引用类型。
一年多之前 回复
dpyoh6553
dpyoh6553 否。数组不是Go中的指针或引用类型。
4 年多之前 回复
dqv2743
dqv2743 分配一个数组将复制整个数组,就好像它是一个结构一样。 这与C语言不同。要创建数组指针,必须使用'&'显式获取地址。
6 年多之前 回复



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

  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)
</ code> </ pre>

OUT:</ p>

  A:[1 2 3] 
B:[ 0 0 0]
A:[1 2 3]
B2:[1 2 3]
A:[1 2 3]
B3:[1 9 3]
</ code> </ pre>
</ DIV>

展开原文

原文

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]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐