2012-05-31 22 views
35

अक्सर लिखने में आवेदन करें, मैं []byte या string का उपयोग करने के विकल्प के साथ खुद को ढूंढता हूं। []byte की स्पष्ट परिवर्तनशीलता के अलावा, मैं कैसे तय करूं कि किस का उपयोग करना है?गो में [] बाइट या स्ट्रिंग का उपयोग कब करें?

मैं उदाहरण के लिए कई उपयोग के मामलों है:

  1. एक समारोह के लिए एक नया []byte देता है। चूंकि स्लाइस क्षमता तय की गई है, इसलिए स्ट्रिंग वापस नहीं करने के लिए क्या कारण है?
  2. []byte डिफ़ॉल्ट रूप से string के रूप में अच्छी तरह से मुद्रित नहीं होते हैं, इसलिए मैं अक्सर लॉगिंग उद्देश्यों के लिए string पर कास्टिंग करता हूं। क्या यह हमेशा string होना चाहिए?
  3. []byte को तैयार करते समय, एक नई अंतर्निहित सरणी हमेशा बनाई जाती है। यदि प्रीपेड करने के लिए डेटा स्थिर है, तो यह string क्यों नहीं होना चाहिए?
+1

ऐसा लगता है जैसे यह आपके उपयोग पर निर्भर करता है। यदि आप उनके साथ स्ट्रिंग-वाई ऑप्स करने की योजना बना रहे हैं, तो उसे 'स्ट्रिंग' कहते हैं। यदि यह सिर्फ अपारदर्शी डेटा को चारों ओर घुमाया जा रहा है, तो क्यों नहीं [[] बाइट'? यह उपयोग के मामलों में आता है। – Ashe

+0

और यदि आपको यूटीएफ -8 एन्कोडेड बाइट्स की धारा के बजाय अलग-अलग वर्णों को संसाधित करने की आवश्यकता है, तो इसे पहले रन (32 बिट इन्ट्स आईआईआरसी) में परिवर्तित करें। –

+0

तब भी '[] rune' है, जो वर्णों की एक परिवर्तनीय स्ट्रिंग का प्रतिनिधित्व करने के लिए सबसे अच्छा है – newacct

उत्तर

16

मेरी सलाह डिफ़ॉल्ट रूप से स्ट्रिंग का उपयोग करना होगा जब आप पाठ के साथ काम कर रहे हों। लेकिन [] बाइट का उपयोग करने के बजाय यदि निम्न स्थितियों में से एक लागू होता है:

  • एक [] बाइट की अस्थिरता काफी जरूरत आवंटन की संख्या कम हो जाएगा।

  • आप एक एपीआई से निपट रहे हैं जो [] बाइट का उपयोग करता है, और स्ट्रिंग में रूपांतरण से परहेज आपके कोड को सरल बना देगा।

5
  1. एक अंतर यह लौटे []byte संभावित एक और/नई डेटा रखने के लिए पुन: उपयोग किया जा सकता है कि (w/ओ नई स्मृति आवंटन) है, जबकि string नहीं कर सकता है। एक और बात यह है कि जीसी कार्यान्वयन में कम से कम, string[]byte से एक शब्द छोटी इकाई है। कुछ स्मृति को सहेजने के लिए उपयोग किया जा सकता है जब ऐसी कई वस्तुएं रहते हैं।

  2. लॉगिंग के लिए []byte से string कास्टिंग आवश्यक नहीं है। विशिष्ट 'टेक्स्ट' क्रियाएं, जैसे %s, %qstring और []byte अभिव्यक्ति के लिए समान रूप से काम करते हैं। दूसरी दिशा में वही है जो उदा। %x या % 02x

  3. परिक्रमा प्रदर्शन क्यों किया जाता है और यदि परिणाम पर फिर से संयुक्त/कुछ/कहीं और संयुक्त होने के लिए निर्भर करता है। यदि ऐसा है तो []byte बेहतर प्रदर्शन कर सकता है।

+0

एफडब्ल्यूआईडब्ल्यू, '% v' विनिर्देशक [] बाइट को पूर्णांक की सरणी के रूप में मानता है, यह गैर' -f' विधियों के लिए डिफ़ॉल्ट है। उन कार्यों के बारे में भी जो स्लाइस वापस करते हैं, उन्हें तर्क के रूप में लेने के बजाय? –

+0

क्या मतलब है "स्ट्रिंग [] बाइट से एक शब्द छोटी इकाई है"? – animaacija

10

मुझे यह समझ गया है कि गो में, किसी अन्य गैर-एमएल शैली भाषा से अधिक, इस प्रकार का अर्थ अर्थ और इच्छित उपयोग को व्यक्त करने के लिए किया जाता है। तो, यह जानने का सबसे अच्छा तरीका है कि किस प्रकार का उपयोग करना है, यह पूछना है कि डेटा है।

एक स्ट्रिंग टेक्स्ट का प्रतिनिधित्व करती है। बस पाठ एन्कोडिंग ऐसा कुछ नहीं है जिसके बारे में आपको चिंता करने की ज़रूरत है और सभी परिचालन चरित्र के आधार पर चरित्र पर काम करते हैं, भले ही एक 'चरित्र' वास्तव में है।

एक सरणी या तो बाइनरी डेटा या उस डेटा के विशिष्ट एन्कोडिंग का प्रतिनिधित्व करती है। []byte का अर्थ है कि डेटा या तो केवल एक बाइट स्ट्रीम या एकल बाइट वर्णों की धारा है। []int16 एक पूर्णांक धारा या दो बाइट वर्णों की एक धारा का प्रतिनिधित्व करता है।

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

संपादित करें: This post वह जगह है जहां मुझे स्ट्रिंग को तोड़ने के लिए प्रकार रूपांतरण का उपयोग करने के लिए तर्क मिला।

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