2013-09-01 7 views
15

Goに1つの配列を別の配列にコピーするための組み込み関数はありますか? 2つ(またはそれ以上)の次元配列の場合、これは機能しますか?Go言語で配列をコピーする機能

+0

落とし穴:配列とスライスがかなり似ていますが、動作が異なります。配列は値によって、スライスは参照(簡略化)されます。 – Christian

答えて

18

配列を別の配列にコピーするためのGo言語の組み込み関数はありますか?

はい:http://play.golang.org/p/_lYNw9SXN5

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

copy(a, b) 

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

れる2つの(またはそれ以上)の次元アレイの場合には、この作業?手動でそれを行うことができます:私は内蔵の多次元配列の深copysを行うためないと思う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 

copyは、行のシャローコピーを行います以下のような: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 

編集:コメントで指摘したように、私は配列はとディープコピーすることができますように、あなたは「スライスのディープコピーを行う」意味「の配列をコピー」が想定していますオペレータjnmlの回答の通り(配列は値型であるため):それは他のタイプの任意の他の値の場合と同様http://play.golang.org/p/8EuFqXnqPB

+0

ありがとうございます。それは助けた –

+4

あなたは質問に答えました: "1つのスライスを別のスライスにコピーするためのGo言語の組み込み関数はありますか?" OPが実際に望んでいたものかもしれませんが、配列とスライスの違いを説明する必要があります。 –

12

移動に配列をコピーするための主要な「機能」は、assignment operator =あります。

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


出力:

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

@ErikAigner配列を代入すると、あたかも構造体のように配列全体がコピーされます。これはC言語とは異なります。配列ポインタを作成するには、明示的にアドレスを '&'で指定する必要があります。 – galaktor

+0

@ErikAignerいいえ、配列は、Goでポインタでも参照型でもありません。 – Jeremy

6

使用copyhttp://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] 
関連する問題