2012-01-07 23 views
6

गो प्रोग्रामिंग भाषा में; पॉइंटर्स पॉइंटर्स कैसे उपयोगी हो सकते हैं?पॉइंटर्स के लिए पॉइंटर्स क्या हैं?

(क्यों करता है, तो वे वास्तव में उपयोगी नहीं हैं वे नहीं अवैध हैं?)

+6

किसी भी डेटा के लिए सूचक उपयोगी हैं। पॉइंटर्स डेटा हैं। तो प्वाइंटर्स के पॉइंटर्स उपयोगी होते हैं, और पॉइंटर्स पॉइंटर्स के पॉइंटर्स हैं, ... –

+0

मैं सहमत हूं, लेकिन चूंकि कोई पॉइंटर अंकगणित नहीं है और न ही पॉइंटर्स के साथ कुछ भी करने के लिए कुछ भी है, वे वास्तव में बेकार हैं। – thwd

+0

गो में पॉइंटर अंकगणित है। आप 'unintfe' पैकेज प्राप्त करने के लिए 'असुरक्षित' पैकेज का उपयोग कर सकते हैं जिसका आप स्वतंत्र रूप से उपयोग कर सकते हैं। कुछ मामलों में, इस दृष्टिकोण से अधिक कुशल कोड हो सकता है, लेकिन सामान्य रूप से, इसे टालना चाहिए। – tux21b

उत्तर

16

किसी भी डेटा प्रकार की उपयोगिता पर समस्या हल की जा रही है और समस्या को हल करने के लिए इस्तेमाल पद्धति पर निर्भर करता है। यदि कोई डेटा प्रकार समस्या में फिट नहीं होता है, तो यह समस्या को ठीक नहीं करता है - और इसके लिए और कुछ भी नहीं है।

गो प्रोग्रामिंग भाषा (साथ ही साथ अन्य प्रोग्रामिंग भाषाएं) सरल नियमों पर आधारित है जो प्रोग्रामर नए डेटा प्रकार बनाने के लिए उपयोग कर सकते हैं। इन नियमों से कुछ हैं:

  • *T: टी
  • की एक सरणी
  • struct { t T; u U ... }: एक नया डेटा प्रकार है कि एक सूचक टी करने के लिए
  • [10]T बनाने एक संरचना है जो एक घटक के रूप में एक टी शामिल
  • ...

प्रोग्रामर इन सरल नियमों को लिखकर जटिल डेटा प्रकार बना सकते हैं। संभावित डेटा प्रकारों की कुल संख्या उपयोगी डेटा प्रकारों की संख्या से अधिक है। जाहिर है, वहां डेटा प्रकार मौजूद हैं (और मौजूद हैं) जो कि उपयोगी नहीं हैं। यह इस तथ्य का एक प्राकृतिक परिणाम है कि नए डेटा प्रकारों के निर्माण के नियम सरल हैं।

प्रकार **T किसी प्रकार की श्रेणी में आता है जो प्रोग्राम में प्रकट होने के लिए कम संभव है। तथ्य यह है कि *****T लिखना संभव है यह इस बात का तात्पर्य नहीं है कि इस तरह के एक प्रकार को बेहद उपयोगी होना चाहिए।


और अंत में, अपने प्रश्न का जवाब:

प्रकार **T आमतौर पर संदर्भों जहां हम प्रकार T का एक और मूल्य के लिए प्रकार T के एक मूल्य के उपयोगकर्ताओं रीडायरेक्ट करना चाहते हैं में प्रकट होता है, लेकिन के लिए कुछ कारणों से हमारे पास मूल्य के सभी उपयोगकर्ताओं तक पहुंच नहीं है या उपयोगकर्ताओं को ढूंढने में बहुत अधिक समय नहीं लगेगा:

  1. हमके मानों की प्रतिलिपि बनाना नहीं चाहते हैं(किसी कारण से)
  2. हम एक सूचक के माध्यम से मूल्य का उपयोग करने की
  3. हम करना चाहते हैं जल्दी से एक और मूल्य पर पुन: निर्देशित प्रकार T की एक विशेष मूल्य के सभी उन प्रकार T के एक मूल्य के सभी उपयोगकर्ताओं चाहते हैं

ऐसी स्थिति में, **T का उपयोग कर प्राकृतिक है, क्योंकि यह हे में 3 कदम (1) को लागू करने की अनुमति देता है:

type User_of_T struct { 
    Value **T 
} 

// Redirect all users of a particular value of type T 
// to another value of type T. 
func (u *User_of_T) Redirect(t *T) { 
    *(u.Value) = t 
} 
+0

हालांकि, यह एक स्मार्ट समाधान है। – Tarik

3

सी पॉइंटर्स पॉइंटर्स में काफी आम हैं।उदाहरण के लिए:

  • अधिक आयामी सरणियों उत्पादन मानकों

जाओ में तथापि, संकेत करने के लिए संकेत दिए गए हैं के रूप में

  • संकेत (उदाहरण के लिए तार की एक सरणी, char** argv सबसे प्रमुख उदाहरण यहाँ हो सकता है) काफी दुर्लभ। एक सूचक द्वारा सरणी तक पहुंचने के बजाय, एक टुकड़ा प्रकार होता है (जो आंतरिक रूप से एक पॉइंटर भी संग्रहीत करता है)। इसलिए, आपको अभी भी गो में स्लाइस के टुकड़े का उपयोग करके एक ही तरह का संकेत मिल सकता है, लेकिन आप आमतौर पर **int जैसे कुछ नहीं देख पाएंगे।

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

    उदाहरण के लिए, atomic.StorePointer फ़ंक्शन मानक पुस्तकालय में पॉइंटर्स के पॉइंटर्स के लिए उन दुर्लभ लेकिन अच्छी तरह से छुपा उपयोग-मामलों में से एक हो सकता है।

  • 5

    जब आप फ़ंक्शन करने के लिए पॉइंटर पास करते हैं, तो फ़ंक्शन प्रति कॉपी करता है। तो दी सूचक के लिए नया मान निर्दिष्ट मूल एक के लिए यह बताए का कारण नहीं बनेगा:

    type Smartphone struct { 
        name string 
    } 
    
    type Geek struct { 
        smartphone *Smartphone 
    } 
    
    func replaceByNG(s **Smartphone) { 
        *s = &Smartphone{"Galaxy Nexus"} 
    } 
    
    func replaceByIPhone(s *Smartphone) { 
        s = &Smartphone{"IPhone 4S"} 
    } 
    
    func main() { 
        geek := Geek{&Smartphone{"Nexus S"}} 
        println(geek.smartphone.name) 
    
        replaceByIPhone(geek.smartphone) 
        println(geek.smartphone.name) 
    
        replaceByNG(&geek.smartphone) 
        println(geek.smartphone.name) 
    } 
    

    उत्पादन होता है:

    Nexus S 
    Nexus S 
    Galaxy Nexus 
    
    +0

    वास्तव में उपयोगी उत्तर, यह वही है जो मैंने किसी अन्य फ़ंक्शन में स्लाइस को संशोधित करने का प्रयास किया –

    2

    लिनुस टोर्वाल्ड हाल ही में उल्लेख किया है कि कैसे संकेत की ओर इशारा अच्छा स्वाद (सी) के साथ कोड करने के लिए ले जाते हैं। देखें (दूसरों के बीच) Brian Barto's blog post

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