गो में "नया" क्यों है?


49

मैं अब भी हैरान हूं कि हम newगो में क्यों हैं ।

जब आप किसी संरचना को त्वरित करना चाहते हैं, तो आप करते हैं

t := Thing{}

और आप एक नए उदाहरण के लिए एक पॉइंटर प्राप्त कर सकते हैं

t := &Thing{}

लेकिन यह संभावना भी है:

t := new(Thing)

यह आखिरी भाषा के बाकी हिस्सों के लिए थोड़ा विदेशी लगता है। &Thing{}के रूप में स्पष्ट और संक्षिप्त है new(Thing)और यह केवल उन निर्माणों का उपयोग करता है जिन्हें आप अक्सर कहीं और उपयोग करते हैं। यह और भी एक्स्टेंसिबल है क्योंकि आप इसे बदल सकते हैं &Thing{3}या कर सकते हैं &Thing{Feets:7}

मेरी राय में, एक अनुपूरक कीवर्ड 1 होना महंगा है, यह भाषा को अधिक जटिल बनाता है और आपको जो जानना चाहिए, उसे जोड़ता है। और यह नए लोगों को मुखौटा लगा सकता है कि एक संरचना को तत्काल करने के पीछे क्या है।

यह एक और आरक्षित शब्द भी बनाता है।

तो इसके पीछे क्या कारण है new? क्या यह कभी-कभी उपयोगी होता है? क्या हमें इसका उपयोग करना चाहिए?


1 : हाँ, मुझे पता है कि यह व्याकरण के स्तर पर एक कीवर्ड नहीं है, आप इसे छाया कर सकते हैं , लेकिन यह उचित डेवलपर, एक आरक्षित शब्द के लिए तथ्य को नहीं बदलता है।


3
"... गो कोडर्स के लिए ..." - यही कारण है। एफ # / हास्केल / आदि। C डेवलपर्स के लिए बहुत ही अलग हैं और यही कारण है कि वे ~ 0 ट्रैक्शन प्राप्त कर रहे हैं। स्काला ने एक प्रयास किया और अब यह अधिक स्वीकार्य और सुनने योग्य है।
डेन

12
इसी धारणा के अनुसार, पायथन और रूबी सी डेवलपर्स के लिए बहुत ही अलग-थलग हैं, क्योंकि वे अपरिचित खोजशब्दों के गुच्छा का उपयोग करते हैं, "अजीब" वाक्यविन्यास नियम (जहां ब्रेस होते हैं?) और अजीब शब्दार्थिक अवधारणाएं (जनरेटर? मेटाक्लासेस और सज्जाकार?)। अभी तक वे ~ 0 कर्षण नहीं मिलता है, काफी विपरीत है।
Xion

8
@Xion: क्या आपने रूबी की शुरुआती विकास दर को देखा? यह प्राप्त करने में उम्र लग गई कि यह अब कहां है (सटीक होने के लिए 18 वर्ष)। पायथन और भी पुराना है (1991!)।
जोकिम सॉर

2
@AndresF। स्काला के कुछ प्रतिरोधों का भाषा से कोई लेना-देना नहीं था। एक छोटे प्रोग्रामर (उम्र 25) के रूप में, नाम के बारे में कुछ ही मुझे गणित-आधारित भाषा जैसे कि मटलब (जो कि मेरी बुरी यादें हैं) के बीच एक क्रॉस के बारे में सोचता है और वास्तव में फोरट्रान जैसा पुराना है। इसे देखने के लिए कभी कोई आग्रह नहीं किया गया है।
इज़्काता

4
एक साइड नोट: नया गो में कोई कीवर्ड नहीं है। यह एक अंतर्निहित कार्य है।
मनीष मलिक

जवाबों:


44

पूछने का सबसे अच्छा तरीका शायद इस पर काम करने वाले लोग हैं; वास्तव में मैंने क्या किया !

Tl; dr: यह मूल रूप से पहले था makeऔर &{}, और यह अभी भी कुछ स्थितियों में उपयोग करने का कार्य है।

मूल रूप से, यहाँ उद्धृत सबसे महत्वपूर्ण भाग हैं:

तो नए के पीछे तर्क क्या है? क्या यह कुछ उपयोगी है? क्या हमें इसका उपयोग करना चाहिए?

आप नए के बिना ऐसा नहीं कर सकते

v := new(int)
*v++
fmt.Println(*v)

नया गो का हेडलाइन फीचर नहीं है, आप इसे अक्सर इस्तेमाल नहीं कर पाएंगे, लेकिन जब आपको इसकी आवश्यकता होगी, तो यह वहां है।

चियर्स

डेव

इस तरह के समाधान को दिखाने के बाद एक और जवाब:

vv := 0
v := &vv
*v++
fmt.Println(*v)

मैंने और स्पष्टीकरण मांगा:

तो मूल रूप से, डेव की बात वास्तव में खड़ी नहीं होती है?

ऐसी जगहें हैं जहां सिर्फ अपना पता लेने के लिए एक नए चर में चुपके करना असुविधाजनक है।

मल्टी-स्टेप मुहावरे के बजाय नया (T) का सीधा सीधा अर्थ है।

दवे की बात केवल तभी गिरती है जब महज तकनीकी संभावना (बिना किए new) अपने दम पर मजबूर कर रही हो ।

क्या इस पर चर्चा नहीं की गई क्योंकि यह स्पष्ट था कि गो के पास यह होना चाहिए क्योंकि लगभग हर भाषा में यह है?

"क्या हम रखेंगे new?" चर्चा समय-समय पर होती रहती है। चूंकि हम इसे गो 2 तक नहीं निकाल सकते हैं, अगर मैं वादा को सही ढंग से समझता हूं, तो लूप को फिर से गोल करने से बहुत कुछ प्रतीत नहीं होता है; जब तक गो 2 सोचनीय है, तब तक हमारे पास कुछ अलग और बेहतर विचार हो सकते हैं ...

क्रिस

यह भी ज्यादातर ऐतिहासिक कारणों से है:

आपको परियोजना के इतिहास पर विचार करने की आवश्यकता है। मुझे लगता है कि नया बनाने से पहले सबसे पहले पेश किया गया है।

यह सच है। वास्तव में हम मेक के विचार के साथ आने से पहले कुछ समय तक संघर्ष करते रहे। यदि आप रिपॉजिटरी लॉग को देखते हैं तो आप देख सकते हैं कि जनवरी 2009 में केवल शो ही दिखाई देते हैं, 9a924177598f संशोधन करें।

नए बिल्टइन फंक्शन ने एक समग्र शाब्दिक का पता लेने के लिए & {} के विचार से पहले और (यह वाक्य रचना कुछ अर्थों में गलत है; यह संभवतः होना चाहिए था (* T) {T के फ़ील्ड} लेकिन पर्याप्त नहीं था इसे बदलने का कारण)।

नया फ़ंक्शन कड़ाई से आवश्यक नहीं है, लेकिन कोड व्यवहार में इसका उपयोग करने लगता है। इस बिंदु पर इससे छुटकारा पाना कठिन है।

इयान


मुझे दूसरे को लिंक देखकर खुशी होगी "क्या हम नया रखेंगे?" चर्चा जो समय-समय पर पॉप अप होती है
डेगस सेगुरेट

क्या कुछ आपको v := &(0)टेम्प वैरिएबल को करने और रोकने से रोकता है ? (आई नो नो गो।)
एलेक्स फेइमैन

3
@AlexFeinman जैसा कि 0शाब्दिक निरंतर है, आप इसका पता नहीं लगा सकते। यदि आप एक विशिष्ट प्रकार भी चाहते हैं तो एक समस्या होगी। यही कारण है कि एक वाक्यविन्यास की तरह &intया &int(0)उपयोगी हो सकता है (हालांकि सबसे अच्छा वाक्यविन्यास के बारे में बहुत कुछ नहीं सोचा, हालांकि)। लेकिन यह दो लाइनों में करना जैसा कि कोलिन्स ने दिखाया है वह भी ठीक है ( vv := 0; v := &vv)।
सेज्यूरेट

14
"चूंकि हम इसे गो 2 तक नहीं निकाल सकते हैं" ... जो, जैसा कि सभी जानते हैं, कभी नहीं होगा क्योंकि Go 2हानिकारक माना जाता है।
मेसन व्हीलर

2
@MasonWheeler आपने मुझे लगभग मार डाला ... अभी भी "गो 2 हानिकारक माना" पर हँसी ... अजीब तरह से पर्याप्त मैं उस लेख के बारे में आज दोपहर के भोजन पर बात कर रहा था।
डेनिएला पेट्रूजेलक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.