गो

2014-10-02 8 views
17

में structs की init सरणी मैं गो में नौसिखिया हूँ। यह मुद्दा मुझे पागल कर रहा है। आप गो में structs की सरणी कैसे लगाते हैं?गो

type opt struct { 
    shortnm  char 
    longnm, help string 
    needArg  bool 
} 

const basename_opts []opt { 
     opt { 
      shortnm: 'a', 
      longnm: "multiple", 
      needArg: false, 
      help: "Usage for a"} 
     }, 
     opt { 
      shortnm: 'b', 
      longnm: "b-option", 
      needArg: false, 
      help: "Usage for b"} 
    } 

कंपाइलर ने कहा कि यह ';' की अपेक्षा करता है [] विकल्प के बाद।

मुझे ब्रेसिज़ '{' को स्ट्रक्चर की मेरी सरणी में कहां रखा जाना चाहिए?

धन्यवाद

उत्तर

30

ऐसा लगता है कि आप (लगभग) यहां उपयोग करने के लिए सीधे सी कोड को कोशिश कर रहे हैं। जाओ कुछ मतभेद हैं।

  • सबसे पहले, आप const के रूप में सरणी और स्लाइस को प्रारंभ नहीं कर सकते हैं। const शब्द का गो में एक अलग अर्थ है, क्योंकि यह सी में करता है। सूची को var के रूप में परिभाषित किया जाना चाहिए।
  • दूसरा, स्टाइल नियम के रूप में, basename_opts के विपरीत basenameOpts पसंद करते हैं।
  • कोई char गो में टाइप नहीं है। यदि आप यूनिकोड कोडपॉइंट्स को अनुमति देना चाहते हैं तो शायद आप byte (या rune चाहते हैं)।
  • सूची की घोषणा इस मामले में असाइनमेंट ऑपरेटर होना चाहिए। उदा। var x = foo
  • गो के पार्सर की आवश्यकता है कि एक सूची घोषणा में प्रत्येक तत्व अल्पविराम के साथ समाप्त होता है। इसमें अंतिम तत्व शामिल है। इसका कारण यह है कि जब आवश्यक हो वहां स्वचालित रूप से सेमी-कॉलन डालें। और काम करने के लिए इसके लिए कुछ हद तक कठोर वाक्यविन्यास की आवश्यकता है।

उदाहरण के लिए:

type opt struct { 
    shortnm  byte 
    longnm, help string 
    needArg  bool 
} 

var basenameOpts = []opt { 
    opt { 
     shortnm: 'a', 
     longnm: "multiple", 
     needArg: false, 
     help: "Usage for a", 
    }, 
    opt { 
     shortnm: 'b', 
     longnm: "b-option", 
     needArg: false, 
     help: "Usage for b", 
    }, 
} 

एक वैकल्पिक अपने प्रकार के साथ सूची की घोषणा करने और फिर एक init फ़ंक्शन का उपयोग करें यह को भरने के लिए है। यदि आप डेटा संरचना में फ़ंक्शंस द्वारा लौटाए गए मानों का उपयोग करना चाहते हैं तो यह अधिक उपयोगी होता है। init फ़ंक्शन चलाए जाते हैं जब प्रोग्राम प्रारंभ किया जा रहा है और main से पहले समाप्त होने की गारंटी दी जाती है। आपके पास पैकेज में एकाधिक init फ़ंक्शंस, या यहां तक ​​कि एक ही स्रोत फ़ाइल में हो सकते हैं।

type opt struct { 
    shortnm  byte 
    longnm, help string 
    needArg  bool 
} 

var basenameOpts []opt 

func init() { 
    basenameOpts = []opt{ 
     opt { 
      shortnm: 'a', 
      longnm: "multiple", 
      needArg: false, 
      help: "Usage for a", 
     }, 
     opt { 
      shortnm: 'b', 
      longnm: "b-option", 
      needArg: false, 
      help: "Usage for b", 
     }, 
    ) 
} 

जब से तुम जाओ के लिए नए हैं, मैं दृढ़ता से the language specification के माध्यम से पढ़ने की सलाह। यह बहुत छोटा और बहुत स्पष्ट रूप से लिखा गया है। यह आपके लिए बहुत कम idiosyncrasies को साफ़ करेगा।

एक आम प्रारंभ समय में यह सब परिभाषित करने के लिए जिस तरह से एक गुमनाम struct उपयोग कर रहा है:

var opts = []struct { 
    shortnm  byte 
    longnm, help string 
    needArg  bool 
}{ 
    {'a', "multiple", "Usage for a", false}, 
    { 
     shortnm: 'b', 
     longnm: "b-option", 
     needArg: false, 
     help: "Usage for b", 
    }, 
} 

यह आमतौर पर परीक्षण के लिए प्रयोग किया जाता है

18

सिर्फ @ jimt करने के लिए एक अतिरिक्त के रूप में इस जोड़ना उत्कृष्ट जवाब उनके माध्यम से कुछ परीक्षण मामलों और लूप को परिभाषित करने के लिए अच्छी तरह से।