2012-10-30 13 views
75

मैं कोशिश की है घोषित:एक निरंतर सरणी

const ascii = "abcdefghijklmnopqrstuvwxyz" 
const letter_goodness []float32 = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 } 
const letter_goodness = { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 } 
const letter_goodness = []float32 { .0817,.0149,.0278,.0425,.1270,.0223,.0202, .0609,.0697,.0015,.0077,.0402,.0241,.0675, .0751,.0193,.0009,.0599,.0633,.0906,.0276, .0098,.0236,.0015,.0197,.0007 } 

पहले, घोषणा और प्रारंभ ठीक काम करता है, लेकिन दूसरे, तीसरे और चौथे काम नहीं करते। मैं फ्लोट की कॉन्स सरणी कैसे घोषित और आरंभ कर सकता हूं?

उत्तर

109

एक सरणी प्रकृति द्वारा अपरिवर्तनीय नहीं है; आप इसे स्थिर नहीं बना सकते हैं।

निकटतम आप प्राप्त कर सकते है:

var letter_goodness = [...]float32 {.0817, .0149, .0278, .0425, .1270, .0223, .0202, .0609, .0697, .0015, .0077, .0402, .0241, .0675, .0751, .0193, .0009, .0599, .0633, .0906, .0276, .0098, .0236, .0015, .0197, .0007 } 
+71

: '[...] T' वाक्य रचना के लिए' [123] T' चीनी है। यह एक निश्चित आकार सरणी बनाता है, लेकिन संकलक को यह पता लगाने देता है कि इसमें कितने तत्व हैं। – jimt

+3

मुझे लगता है कि निरंतर सरणी को सिस्टम सिस्टम के अपडेट की आवश्यकता होगी। अन्यथा यदि आपने एक फ़ंक्शन 'f (xs [5] int) परिभाषित किया है, तो आप नहीं जान पाएंगे कि सरणी पारित या निरंतर था या नहीं। –

+0

tks, जब मैं स्ट्रिंग्स को आज़माता हूं तो मुझे समस्याएं होती हैं। जॉइन 'स्थिरांक का उपयोग नहीं कर सकता। फ़ील्स की आवश्यकता होती है (प्रकार [4] स्ट्रिंग) स्ट्रिंग के लिए तर्क में [] स्ट्रिंग के रूप में टाइप करें। जॉइन ' –

34

Effective Go से:

जाओ में

स्थिरांक सिर्फ इतना है कि-लगातार कर रहे हैं। वे संकलन समय पर बनाए जाते हैं, भले ही कार्यों में स्थानीय लोगों के रूप में परिभाषित किया गया हो, और केवल संख्याएं, तार या बुलियन हो सकते हैं। संकलन-समय प्रतिबंध के कारण, उन्हें परिभाषित करने वाले अभिव्यक्तियों को स्थिर अभिव्यक्ति होना चाहिए, संकलक द्वारा मूल्यांकन योग्य होना चाहिए। उदाहरण के लिए, 1 < < 3 निरंतर अभिव्यक्ति है, जबकि गणित .in (गणित। पीआई/4) ऐसा इसलिए नहीं है क्योंकि फ़ंक्शन को गणित के लिए कॉल किया जाता है। इसे रन टाइम पर होने की आवश्यकता होती है।

स्लाइस और सरणियों हमेशा मूल्यांकन रनटाइम के दौरान किया जाता है:

var TestSlice = []float32 {.03, .02} 
var TestArray = [2]float32 {.03, .02} 
var TestArray2 = [...]float32 {.03, .02} 

[...] संकलक बताता सरणी खुद की लंबाई यह पता लगाने की। स्लाइस लपेटें सरणी और ज्यादातर मामलों में काम करना आसान है। स्थिरांक उपयोग करने के बजाय सिर्फ एक छोटे अक्षर पहले अक्षर का उपयोग करके चर अन्य पैकेजों को unaccessible बनाने:

var ThisIsPublic = [2]float32 {.03, .02} 
var thisIsPrivate = [2]float32 {.03, .02} 

thisIsPrivate केवल पैकेज यह परिभाषित किया गया है में उपलब्ध है। यदि आपको बाहर से पढ़ने की पहुंच की आवश्यकता है तो आप एक साधारण गेटर फ़ंक्शन लिख सकते हैं (Getters in golang देखें)।

+0

"उपयोग" उदाहरण कोड मान्य नहीं है Go: http://play.golang.org/p/JUsLIsIwkW – zzzz

+0

मुझे खेद है, आप सही हैं। मेरा पहला जवाब पूरी तरह से गलत था। यह संपादित उत्तर अब और सहायता प्रदान करना चाहिए। – fasmat

9

गो में सरणी निरंतर जैसी कोई चीज नहीं है।

Go Language Specification: Constants से हवाला देते हुए:

, बूलियन स्थिरांक, रूण स्थिरांक हैं पूर्णांक स्थिरांक, फ्लोटिंग प्वाइंट, जटिल स्थिरांक स्थिरांक और स्ट्रिंग स्थिरांक। रूने, पूर्णांक, फ़्लोटिंग-पॉइंट, और जटिल स्थिरांक सामूहिक रूप से संख्यात्मक स्थिरांक कहा जाता है।

एक Constant expression (जो एक स्थिर प्रारंभ करने में प्रयोग किया जाता है) केवल constant ऑपरेंड हो सकती है और संकलन समय पर मूल्यांकन किया जाता है।

विनिर्देश विभिन्न प्रकार के स्थिरांक सूचीबद्ध करता है। ध्यान दें कि आप के रूप में स्वीकृत प्रकारों में से किसी एक प्रकार के constant expressions के साथ स्थिरांक बना और प्रारंभ कर सकते हैं।उदाहरण के लिए इस मान्य है:

func main() { 
    type Myint int 
    const i1 Myint = 1 
    const i2 = Myint(2) 
    fmt.Printf("%T %v\n", i1, i1) 
    fmt.Printf("%T %v\n", i2, i2) 
} 

आउटपुट (Go Playground पर यह कोशिश):

main.Myint 1 
main.Myint 2 

आप एक सरणी की जरूरत है, यह केवल एक चर हो सकता है लेकिन एक निरंतर नहीं। Constants

+0

फिर स्थिर आकार वाले कंटेनर की आवश्यकता होने पर क्या करें? –

+0

@Atomic_alarm क्या आप कृपया विस्तृत कर सकते हैं? – icza

+0

मौजूद है कि गोलांग एनालॉग सी-सरणी में क्या है? –

1

दूसरों का उल्लेख किया है, वहाँ है कोई आधिकारिक जाओ इस के लिए निर्माण:

मैं स्थिरांक के बारे में इस महान ब्लॉग लेख सलाह देते हैं। मैं कल्पना कर सकता हूं कि एक टुकड़ा एक टुकड़ा लौटाता है। इस तरह, आप गारंटी दे सकते हैं कि कोई भी मूल टुकड़ा के तत्वों में हेरफेर नहीं करेगा (क्योंकि यह सरणी में "हार्ड-कोडेड" है)।

मैं अपने टुकड़ा छोटा है इसे बनाने के लिए ... कम ...:

func GetLetterGoodness() []float32 { 
    return [...]float32 { .0817,.0149,.0278,.0425,.1270,.0223 } 
} 
बस स्पष्टीकरण के लिए
+0

यह जाने का सबसे अच्छा तरीका लगता है, हालांकि func वापसी प्रकार मेल नहीं खाता है। '[6] स्ट्रिंग शाब्दिक (प्रकार [6] स्ट्रिंग) का उपयोग नहीं कर सकते हैं क्योंकि रीटर्न तर्क' में प्रकार [] स्ट्रिंग के रूप में 'वापसी [] float32 {...} ' – theRemix

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