एक निरंतर सरणी घोषित करें


164

मैंने कोशिश की है:

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 }

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

जवाबों:


232

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

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

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 }

[...]इसके बजाय ध्यान दें []: यह सुनिश्चित करता है कि आपको स्लाइस के बजाय एक (निश्चित आकार) सरणी प्राप्त हो। इसलिए मान निश्चित नहीं हैं, लेकिन आकार है।


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

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

tks, जब मैं स्ट्रिंग्स करने की कोशिश करता हूं तो मुझे समस्या होती है। जॉइन cannot use constants.FilesRequired (type [4]string) as type []string in argument to strings.Join
एड्डी हर्नांडेज़

स्लाइस समाधान के लिए धन्यवाद। शंका: एक सरणी ही अपरिवर्तनीय है, है ना? एक बार कोई सरणी बनाई जाने के बाद कोई भी तत्वों को जोड़ या हटा नहीं सकता, नहीं? हालाँकि, मैं ऐरे तत्वों को संपादित कर सकता हूँ।
लीजेंड्स 2k

@ legends2k आप सरणी का आकार नहीं बदल सकते, हाँ, लेकिन आप इसके स्लॉट में अन्य मान रख सकते हैं।
डेनस सेगुरेट

63

से प्रभावी जाओ :

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

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

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

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

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

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


12

गो में ऐरे कन्टेन्ट जैसी कोई चीज नहीं है।

भाषा की विशिष्टता से उद्धरण : लगातार :

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

एक निरंतर अभिव्यक्ति (जिसका उपयोग किसी निरंतर को शुरू करने के लिए किया जाता है) में केवल निरंतर ऑपरेंड होते हैं और संकलन समय पर मूल्यांकन किए जाते हैं।

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

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)
}

आउटपुट (इसे खेल के मैदान पर आज़माएं ):

main.Myint 1
main.Myint 2

यदि आपको एक सरणी की आवश्यकता है, तो यह केवल एक चर हो सकता है, लेकिन स्थिर नहीं।

मैं स्थिरांक के बारे में इस महान ब्लॉग लेख की सलाह देता हूं: निरंतर


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

@Atomic_alarm क्या आप कृपया विस्तार से बता सकते हैं?
आईसीजे

अस्तित्व में है कि क्या गॉलंग एनालॉग सी-सरणी में?

@Atomic_alarm हाँ, सरणियाँ गो में भी मौजूद हैं, वे केवल निरंतर अभिव्यक्ति नहीं हैं, उनका मूल्यांकन रनटाइम पर किया जाता है। तो एक स्थिरांक एक सरणी प्रकार का नहीं हो सकता है, लेकिन एक चर हो सकता है। उदाहरण के लिए:var arr = [2]int{2, 3}
icza

3

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

मैंने इसे छोटा करने के लिए आपका टुकड़ा छोटा कर दिया है ... छोटा ...:

func GetLetterGoodness() []float32 {
    return [...]float32 { .0817,.0149,.0278,.0425,.1270,.0223 }
}

4
यह जाने का सबसे अच्छा तरीका लगता है, हालांकि फंक रिटर्न प्रकार मेल नहीं खाता है। cannot use [6]string literal (type [6]string) as type []string in return argumentsoreturn []float32 { ... }
द रीमिक्स

@ रीमिक्स तीन संभावित फ़िक्सेस: (1) ...एक एरे शाब्दिक के बजाय एक स्लाइस शाब्दिक घोषित करने के लिए इसे हटा दें । (2) वापसी प्रकार को बदल कर [6]float32। (3) एक सरणी चर के लिए अभिव्यक्ति असाइन करें, a := [...]float32 { (etc.) }और सभी तत्वों का टुकड़ा वापस करें return a[:]:। (ऐरे शाब्दिक शब्द सम्मत नहीं हैं, मैं स्पष्ट नहीं हूँ कि क्यों।)
डेविड मोल्स

मुझे यकीन नहीं है कि आपका क्या मतलब है। ऐसा लगता है कि आप अपने कोड में कुछ हल करने की कोशिश करते हैं जो संभवतः (यूनिट-) परीक्षणों के साथ बेहतर हल होता है।
डायनामोम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.