अगर, मेरी तरह, आप पाते हैं कि आप अनिवार्य रूप से एक ही स्थान पर एक ही क्रमबद्ध कोड चाहते हैं, या बस कोड की जटिलता को कम रखना चाहते हैं, तो आप अपने आप को एक अलग फ़ंक्शन में छंटनी से दूर कर सकते हैं, जिस पर आप फ़ंक्शन करते हैं वास्तविक काम जो आप चाहते हैं (जो निश्चित रूप से प्रत्येक कॉल साइट पर अलग होगा)।
मुख्य प्रकार K
और मूल्य प्रकार के साथ एक मानचित्र को देखते हुए V
, जैसा कि नीचे <K>
और <V>
नीचे दर्शाया गया है, आम प्रकार फ़ंक्शन इस गो-कोड टेम्प्लेट की तरह लग सकता है (जो कि गो संस्करण 1 के रूप में समर्थन नहीं करता है):
/* Go apparently doesn't support/allow 'interface{}' as the value (or
/* key) of a map such that any arbitrary type can be substituted at
/* run time, so several of these nearly-identical functions might be
/* needed for different key/value type combinations. */
func sortedMap<K><T>(m map[<K>]<V>, f func(k <K>, v <V>)) {
var keys []<K>
for k, _ := range m {
keys = append(keys, k)
}
sort.Strings(keys) # or sort.Ints(keys), sort.Sort(...), etc., per <K>
for _, k := range keys {
v := m[k]
f(k, v)
}
}
फिर इसे इनपुट मानचित्र और एक फ़ंक्शन ( (k <K>, v <V>)
इसके इनपुट तर्कों के रूप में) के साथ कॉल करें , जिसे सॉर्ट-कुंजी क्रम में मैप तत्वों पर कहा जाता है।
तो, Mingu द्वारा पोस्ट किए गए उत्तर में कोड का एक संस्करण जैसा दिख सकता है:
package main
import (
"fmt"
"sort"
)
func sortedMapIntString(m map[int]string, f func(k int, v string)) {
var keys []int
for k, _ := range m {
keys = append(keys, k)
}
sort.Ints(keys)
for _, k := range keys {
f(k, m[k])
}
}
func main() {
// Create a map for processing
m := make(map[int]string)
m[1] = "a"
m[2] = "c"
m[0] = "b"
sortedMapIntString(m,
func(k int, v string) { fmt.Println("Key:", k, "Value:", v) })
}
sortedMapIntString()
समारोह किसी के लिए पुन: उपयोग किए जा सकता है map[int]string
(यह मानते हुए एक ही सॉर्ट क्रम वांछित है), कोड की सिर्फ दो लाइनों के लिए प्रत्येक उपयोग के रखे हुए हैं।
डाउनसाइड में शामिल हैं:
- प्रथम श्रेणी के कार्यों का उपयोग करने के लिए बेहिसाब लोगों के लिए पढ़ना कठिन है
- यह धीमा हो सकता है (मैंने प्रदर्शन तुलना नहीं की है)
अन्य भाषाओं में विभिन्न समाधान हैं:
- यदि (
<K>
और <V>
कुंजी और मूल्य के प्रकारों को निरूपित करने के लिए) का उपयोग थोड़ा परिचित है, तो यह कोड टेम्प्लेट + ++ टेम्प्लेट के विपरीत नहीं है।
- क्लोजर और अन्य भाषाएं मौलिक डेटा प्रकारों के रूप में छांटे गए मानचित्रों का समर्थन करती हैं।
- हालांकि मुझे किसी भी तरह से पता नहीं है कि गो
range
एक प्रथम श्रेणी का प्रकार बनाता है, जिसे कस्टम ordered-range
( range
मूल कोड के स्थान पर) के साथ प्रतिस्थापित किया जा सकता है , मुझे लगता है कि कुछ अन्य भाषाएं पुनरावृत्त प्रदान करती हैं जो समान पूरा करने के लिए पर्याप्त शक्तिशाली हैं चीज़।