एक निजी परियोजना के लिए, मैं कुछ इस तरह से किया था। यह शायद बेहतर बस करना है:
func filter(sl []int, fn func(int) bool) (result []int) {
for _, v := range sl {
if !fn(v) {
result = append(result, v)
}
}
return
}
सरल और क्लीनर।
func filter(sl []int, fn func(int) bool) []int {
outi := 0
res := sl
for _, v := range sl {
if !fn(v) {
res[outi] = v
outi++
}
}
return res[0:outi]
}
आप इस अनुकूलन कर सकते हैं copy
उपयोग करने के लिए तत्वों की सीमाओं को कॉपी करने की है, लेकिन वह दो बार कोड और शायद इसके लायक नहीं है: आप में जगह करना चाहते हैं, तो आप शायद कुछ की तरह चाहते हैं।
func deleteRecords(l []*Record, ids []int) []*Record {
outi := 0
L:
for _, v := range l {
for _, id := range ids {
if v.id == id {
continue L
}
}
l[outi] = v
outi++
}
return l[0:outi]
}
:
तो, यह विशिष्ट मामले में, मैं शायद की तरह कुछ करना चाहते हैं (ध्यान दें:। अपरीक्षित)
कोई आवंटन, कुछ भी नहीं फैंसी, और सूची के किसी न किसी आकार संभालने रिकॉर्ड्स और आपके द्वारा प्रस्तुत आईड्स की सूची, एक साधारण रैखिक खोज करने की संभावना है साथ ही प्रशंसक चीजें, लेकिन बिना किसी ओवरहेड के। मुझे एहसास है कि मेरा संस्करण टुकड़ा और एक नया टुकड़ा लौटाता है, लेकिन यह गो में गैर-मूर्खतापूर्ण नहीं है, और यह आवंटित ढेर के लिए कॉलसाइट पर टुकड़ा को मजबूर करने से बचाता है।
स्रोत
2011-02-16 22:25:38
मैंने अपनी कुछ बेंचमार्किंग की है और यह पुष्टि कर रहा हूं कि आपकी विधियां बहुत तेज हैं। मुझे आपके पहले फ़ंक्शन पर रीडर फ़ंक्शन पर एक स्पीडअप नहीं मिला। ऐसा लगता है कि फ़ंक्शन कॉल अभी भी धीमी हैं (कम से कम विंडोज 8 जी पर। (शायद अगर संकलक इनलाइनिंग शुरू कर देता है तो बदल जाएगा।) –
यह अच्छा है, मुझे आश्चर्य है कि क्यों गो टीम एकल/एकाधिक प्रविष्टियों को हटाने के लिए एक सुरक्षित विधि प्रदान नहीं करती है एक टुकड़ा से। यह स्पष्ट रूप से एक सामान्य विधि है। –
यदि आपको अक्सर ऐसा करने की आवश्यकता है, तो 'कंटेनर/सूची' द्वारा प्रदान की गई दोगुनी-लिंक्ड सूची का उपयोग करने पर विचार करें। – mk12