2013-09-01 4 views
15

क्या किसी सरणी को दूसरे में कॉपी करने के लिए गो में कोई अंतर्निहित फ़ंक्शन है? क्या यह दो (या अधिक) आयामी सरणी के मामले में काम करेगा?गो भाषा में सरणी की प्रतिलिपि बनाने के लिए फ़ंक्शन

+0

Pitfall: सरणी और स्लाइस बहुत समान दिख सकते हैं, व्यवहार अलग है। Arrays मूल्य से हैं, संदर्भ द्वारा स्लाइस (सरलीकृत)। – Christian

उत्तर

18

क्या एक सरणी को दूसरे में कॉपी करने के लिए गो भाषा में कोई अंतर्निहित फ़ंक्शन है?

हाँ: http://play.golang.org/p/_lYNw9SXN5

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

copy(a, b) 

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

विल दो (या अधिक) आयामी सरणी के मामले में यह काम करता है? 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 

मैं वहाँ एक अंतर्निहित बहुआयामी सरणियों के गहरे copys करने के लिए नहीं लगता है: आप इसे मैन्युअल रूप से कर सकते हैं

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 

संपादित करें: के रूप में टिप्पणी में कहा, मैं "एक सरणी कॉपी" आप मतलब था "एक टुकड़ा की एक गहरी प्रतिलिपि करते हैं", के रूप में सरणियों 0,123,665 के साथ गहरे कॉपी किया जा सकता द्वारा ग्रहण कियाऑपरेटर jnml के जवाब के अनुसार (क्योंकि सरणियों मूल्य प्रकार के होते हैं): http://play.golang.org/p/8EuFqXnqPB

+0

बहुत बहुत धन्यवाद। इससे –

+4

आपकी मदद मिली है: "क्या एक स्लाइस को दूसरे में कॉपी करने के लिए गो भाषा में कोई अंतर्निहित फ़ंक्शन है?" जो ओपी वास्तव में चाहता था वह हो सकता है लेकिन आपको सरणी और स्लाइस के बीच अंतर समझा जाना चाहिए। –

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 एक सरणी असाइन करने से पूरे सरणी की प्रतिलिपि बनाई जाएगी, जैसे कि यह एक संरचना थी। यह सी से अलग है। एक सरणी सूचक बनाने के लिए आपको स्पष्ट रूप से '&' का उपयोग करके पता लेना होगा। – galaktor

+0

@EricAigner सं। Arrays * नहीं * एक सूचक या संदर्भ में एक संदर्भ प्रकार हैं। – 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) 

बाहर:

A: [1 2 3] 
B: [0 0 0] 
A: [1 2 3] 
B2: [1 2 3] 
A: [1 2 3] 
B3: [1 9 3] 
संबंधित मुद्दे