2012-05-30 13 views
5

मैं कुछ कोड लिख रहा हूं जिसके लिए कार्यक्षमता की आवश्यकता है जो पैकेज में ReadBytes विधि से लगभग संतुष्ट है। विशेष रूप से, यह विधि Reader से तब तक पढ़ती है जब तक कि यह किसी विशेष बाइट से मुकाबला न हो। मुझे ऐसा कुछ चाहिए जो तब तक पढ़ता है जब तक कि यह दो बाइट्स (स्पेस, न्यूलाइन और टैब मुख्य रूप से) में से किसी एक से मुठभेड़ नहीं करता है।किसी मौजूदा (मानक) पैकेज में नया फ़ंक्शन जोड़ना

मैंने पुस्तकालय के स्रोत को देखा और मुझे पता है कि अगर मुझे bufio structs द्वारा उपयोग किए जाने वाले आंतरिक बफर तक पहुंच है तो मुझे क्या करना है। क्या कोई तरीका है कि मैं पैकेज को "बंदर पैच" कर सकता हूं और इसमें कोई और विधि जोड़ सकता हूं? या कार्यक्षमता पाने के लिए एक और तरीका मुझे चाहिए? इस दृष्टिकोण के साथ

+1

निजी छिपे हुए फ़ील्ड एक प्रमुख कारण यह है कि उपयोगकर्ताओं को प्रभावित किए बिना भविष्य में कार्यान्वयन के लिए इसे कार्यान्वित करना संभव हो। आपको बाइट तक पहुंचने की इजाजत देने से यह गारंटी टूट जाएगी। इसलिए मुझे अपनी खुद की (सीमित) रीडर संरचना और विधि बनाने के अलावा अन्य उचित तरीका नहीं दिख रहा है। –

+2

आपका प्रश्न एक वास्तविक समाधान (बफियो को बढ़ाने) के बारे में है जो आपके वास्तविक समस्या (एक निश्चित डेटा प्रारूप को पढ़ने के लिए) में है। चूंकि उत्तर और टिप्पणियां इंगित करती हैं, गो के पैकेज फीचर्स वास्तव में ऐसा करने से आपको बाधित करने के लिए इंजीनियर थे। अन्य समाधानों पर विचार करना बेहतर हो सकता है, या अपने डेटा प्रारूप के विवरण के साथ SO पर एक और प्रश्न पोस्ट करना बेहतर होगा और पूछें, "इस बहु-डिलीमीटर प्रारूप को पढ़ने का एक अच्छा तरीका क्या है?" – Sonia

उत्तर

5

कुछ (सावधानी: अपरीक्षित कोड):

type reader struct{ 
     *bufio.Reader // 'reader' inherits all bufio.Reader methods 
} 

func newReader(rd io.Reader) reader { 
     return reader{bufio.NewReader(rd)} 
} 

// Override bufio.Reader.ReadBytes 
func (r reader) ReadBytes(delim byte) (line []byte, err error) { 
     // here goes the monkey patch 
} 

// Or 

// Add a new method to bufio.Reader 
func (r reader) ReadBytesEx(delims []byte) (line []byte, err error) { 
     // here goes the new code 
} 

संपादित करें: मैं उल्लेख किया है कि इस मूल पैकेज internals (गैर संस्थाओं निर्यात) तक पहुँचने के लिए नहीं मदद करता है। आपकी टिप्पणी में बताए जाने के लिए अभय धन्यवाद।

+0

क्या आप bufio के अप्रत्याशित फ़ील्ड तक पहुंच सकते हैं। इस तरह रीडर? –

+1

दुर्भाग्य से नहीं, ऐसा लगता है कि कॉल को आंतरिक संरचना में प्रतिनिधि दिया जा रहा है। पूरी संरचना अभी भी नए में एम्बेडेड है और अभी भी एक अलग इकाई की तरह व्यवहार किया जाता है। आपके पास वास्तव में इसके पैकेज स्थानीय चरों तक पहुंच नहीं है। हालांकि प्रयास के लिए धन्यवाद! –

1

पैकेज API का उपयोग करके समस्याओं को हल करना आमतौर पर सबसे अच्छा होता है। यदि आपके पास अप्रत्याशित सुविधाओं तक पहुंचने के लिए एक अनिवार्य कारण है, तो पैकेज स्रोत की प्रतिलिपि बनाएँ और इसे हैक करें। बीएसडी-शैली लाइसेंस के रूप में उदार के रूप में वे आते हैं।

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