Golang

2014-09-05 14 views
6

में, एक ज्ञात पाठ स्ट्रिंग के साथ एक बाइट टुकड़ा बनाना मैं इस पाठ जो मैं एक बाइट टुकड़ा में डाल करना चाहते हैं:Golang

s := "There are these two young fish swimming along and they happen to meet an older fish swimming the other way" 

अगर मैं लिखना

b := []byte("There are these two young fish swimming along and they happen to meet an older fish swimming the other way") 

मैं समझता हूँ के रूप में , कार्यावधि में इस वसीयत:

  1. स्मृति में मूल्यों के साथ एक स्ट्रिंग बनाने
  2. एक बाइट टुकड़ा
  3. बाइट टुकड़ा में स्ट्रिंग की सामग्री की प्रतिलिपि बनाने के (के रूप में आवश्यक पुनः दिए जाने)

मैं उनके ASCII बराबर करने के लिए स्ट्रिंग से प्रत्येक मान के बदलने और सीधे बाइट टुकड़ा बना सकते हैं:

b := []byte{84, 104, ... } 

हालांकि यह बहुत पठनीय नहीं है।

मैं समझता हूं कि यहां उदाहरण थोड़ा छोटा है और अधिकांश कंप्यूटर फ्लैश में ऐसा कर सकते हैं, लेकिन मैं इसके बारे में उत्सुक हूं। क्या कंपाइलर []byte("blah") की व्याख्या करता है और इसे संकलित समय पर एक कुशल बाइट टुकड़ा में बदल देता है? स्ट्रिंग में गैर-ASCII वर्ण शामिल होने पर सबसे अच्छा समाधान बदल जाएगा?

+1

क्या ये रूपांतरण आपके भीतर की गणना लूप का हिस्सा हैं? क्या यह बाधा है जो प्रोफाइलिंग में दिखाई देती है? क्या जीसी धीमा है क्योंकि आप इस रूपांतरण से बहुत अधिक कचरा उत्पन्न करते हैं? यदि नहीं: परेशान क्यों? – Volker

+0

"क्या स्ट्रिंग में गैर-ASCII वर्ण शामिल होने पर सबसे अच्छा समाधान बदल जाएगा?" नहीं। स्रोत स्रोत utf8 है; '_ _ के लिए चीजें, chr: = range str {...}' लूप हैंडल utf8; आपके कार्यक्रम को शायद यूटीएफ -8 को संभालने के लिए कोई विशेष प्रावधान नहीं करना पड़ेगा। – twotwotwo

+1

ऐसा नहीं लगता कि यह "आवश्यकतानुसार पुनः आवंटित" होगा क्योंकि यह पहले से ही जानता है कि स्ट्रिंग में कितने बाइट हैं, इसलिए यह सामने की पर्याप्त मेमोरी को पकड़ सकता है। बाइट्स को सूचीबद्ध करना बहुत बुरा विचार है (आपका स्रोत कोड बदसूरत बनाता है) और मुझे यकीन नहीं है कि यह infinitesimally अधिक कुशलता से निष्पादित करता है; चूंकि बाइट स्लाइस म्यूटेबल हैं, बाइट्स को अभी भी स्थिर-भूमि से हीप मेमोरी में कॉपी करने की आवश्यकता हो सकती है। इसके अलावा, जैसा कि वोल्कर कहते हैं, स्टार्टअप पर प्रतिलिपि बनाने वाले किसी भी नैनोसेकंड एक बड़ा सौदा नहीं है। – twotwotwo

उत्तर

3

गो स्ट्रिंग अक्षर के रूप में निष्पादन योग्य प्रोग्राम में स्ट्रिंग को एम्बेड करता है। यह runtime.stringtoslicebyte फ़ंक्शन का उपयोग करके रनटाइम पर स्ट्रिंग शाब्दिक को बाइट स्लाइस में परिवर्तित करता है।

2

यदि आप लगातार स्ट्रिंग से []byte चर प्रारंभ कर रहे हैं, तो ऐसा लगता है कि कंपाइलर एक इंटरमीडिएट स्ट्रिंग बनाने के लिए पर्याप्त स्मार्ट नहीं है: इसके बजाए, बाइट स्लाइस के लिए बैकिंग सरणी को स्थिर डेटा से सीधे प्रारंभिक डेटा से शुरू किया गया है स्ट्रिंग चर पहले।

एक डेटा प्रति है, लेकिन एक म्यूटेबल प्रकार का निर्माण करते समय इसकी अपेक्षा की जाती है।

+0

पर गैर-ASCII वर्णों सहित गो स्ट्रिंग्स कैसे काम करते हैं, इस पर एक शानदार पोस्ट है, जहां आपने देखा था ("ऐसा लगता है" के आधार पर) एक संदर्भ उपयोगी होगा यहाँ। – seh

+1

यह संकलक द्वारा उत्पन्न असेंबलर का निरीक्षण करने से था। –