2016-07-13 12 views
9

मैं एक मर्ज सॉर्ट कार्यान्वयन में सरणी के लिए आवश्यक लंबाई की गणना करने की कोशिश कर रहा हूं, मैं go में लिख रहा हूं। यह इस तरह दिखता है:जाओ त्रुटि: गैर-निरंतर सरणी

func merge(array []int, start, middle, end int) { 
    leftLength := middle - start + 1 
    rightLength := end - middle 
    var left [leftLength]int 
    var right [rightLength]int 
    //... 
} 

मैं तो यह शिकायत मिलती है, जब go test चल:

./mergesort.go:6: non-constant array bound leftLength 
./mergesort.go:7: non-constant array bound rightLength 

मुझे लगता है go उपयोगकर्ताओं परिकलित मूल्य के साथ किसी सरणी की लंबाई instantiating का आनंद नहीं करता है। यह केवल स्थिरांक स्वीकार करता है। क्या मुझे बस छोड़ देना चाहिए और इसके बजाय एक टुकड़ा का उपयोग करना चाहिए? मुझे उम्मीद है कि स्लाइस एक गतिशील सरणी है जिसका अर्थ यह है कि यह एक लिंक की गई सूची है या जब यह पूर्ण हो जाता है तो प्रतियों को बड़ी सरणी में कॉपी किया जाता है।

+0

क्या मतलब है कि आप "उम्मीद" एक टुकड़ा गतिशील सरणी है? [पढ़ें कि वास्तव में एक टुकड़ा क्या है] (https://blog.golang.org/go-slices-usage-and-internals)। –

+1

गो में क्या स्लाइस बनाए जाते हैं। हुड के तहत वे सिर्फ सरणी के लिए पॉइंटर्स हैं। – user937284

+0

@TimCooper दिलचस्प। ऐरे के एक जटिल इंटरफ़ेस को देने के बजाय स्लाइस एक और परत है जो सरणी हेरफेर को सरल बनाती है? – Breedly

उत्तर

20

आप रनटाइम पर गणना की गई मान के साथ उस तरह की सरणी को तुरंत चालू नहीं कर सकते हैं। इसके बजाय वांछित लंबाई के साथ एक टुकड़ा शुरू करने के लिए उपयोग करें। यह इस तरह दिखेगा;

left := make([]int, leftLength) 
+2

* वह या आप स्लाइस का उपयोग कर सकते हैं। * स्लाइस * * आपके उदाहरण में उपयोग किए जा रहे हैं; यह वापस आ गया है। –

+0

@TimCooper अच्छा बिंदु। – evanmcdonnal

संबंधित मुद्दे