मैं संग्रह से तत्वों को एक जगह में हटा देना चाहता हूं। पर विचार करें निम्नलिखित स्निपेट:गोलांग स्लाइस तत्वों को हटाने में
package main
import "fmt"
type Ints []int
func (xs Ints) Filter() {
for i := 0; i < len(xs); i++ {
if xs[i]%2 == 0 { // Or some other filtering function
xs = append(xs[:i], xs[i+1:]...)
}
fmt.Printf("i %+v\n", i)
fmt.Printf("xs %+v\n", xs)
}
}
func main() {
a := Ints([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})
fmt.Printf("initial a %+v\n", a)
a.Filter()
fmt.Printf("final a %+v\n", a)
}
http://play.golang.org/p/1nL6Il2Gf1
आश्चर्यजनक परिणाम है: final a [1 3 5 7 9 10 10 10 10 10]
मुझे आश्चर्य है कि यह कैसे करना है। मुझे पूरा यकीन है कि रिसीवर को Ints
पर पॉइंटर होना चाहिए। लेकिन यह कुछ हद तक कोड को गड़बड़ कर देता है (*xs
हर जगह संभावित रूप से ब्रैकेट के साथ जोड़ता है) लेकिन अधिक महत्वपूर्ण बात यह है कि यह वही परिणाम उत्पन्न करता है।
बस एक छोटे से सिफारिश, उपयोग '(* XS) = (* XS) [: filterPos: filterPos]' बजाय टुकड़ा और नि: शुल्क अतिरिक्त स्मृति ट्रिम करने के लिए है, यह एक सभ्य हो सकता है बड़ी वस्तुओं के साथ स्मृति की मात्रा। – OneOfOne
@OneOfOne सच है, यह निर्भर करता है कि क्या आप गति या स्मृति के लिए अनुकूलित कर रहे हैं। मैं वास्तव में सिर्फ एक नया टुकड़ा बनाउंगा और सब कुछ अपरिवर्तनीय रखूंगा, जब तक कि यह स्मृति का एक बड़ा हिस्सा न हो। –
सच है, मेरा मतलब यह है कि http://play.golang.org/p/FgeuFdr3-v – OneOfOne