2012-11-22 14 views
112

मैं बस Go tour के माध्यम से काम कर रहा हूं, और मैं पॉइंटर्स और इंटरफेस के बारे में उलझन में हूं। यह गो कोड संकलित क्यों नहीं करता है?मैं * इंटरफ़ेस को * स्ट्रक्चर क्यों नहीं सौंप सकता?

package main 

type Interface interface {} 

type Struct struct {} 

func main() { 
    var ps *Struct 
    var pi *Interface 
    pi = ps 

    _, _ = pi, ps 
} 

यानी अगर Struct एक Interface है, क्यों एक *Struct एक *Interface नहीं होगी?

त्रुटि संदेश मैं मिलता है:

prog.go:10: cannot use ps (type *Struct) as type *Interface in assignment: 
     *Interface is pointer to interface, not interface 
+1

भी देखें http://stackoverflow.com/q/20874798/260805 – Ztyx

+0

यह इंटरफेस की तरह लग रहा निहित संकेत की तरह बर्ताव कर सकता है ... – Victor

+0

मैं बेहतर बनाने के लिए सुझाव दे सकते हैं 'समारोह मुख्य() { \t वर ps * Struct = नई (struct) \t वर अनुकरणीय * इंटरफ़ेस \t वर मैं इंटरफ़ेस \t i = ps \t अनुकरणीय के साथ अपने खेल का मैदान = & मैं \t fmt.Printf ("% v,% v,% v \ n", * ps, pi, और i) \t i = * ps \t fmt.Printf ("% v,% v,% v \ n", * ps, अनुकरणीय, i) \t _, _, _ = मैं, अनुकरणीय, ps } 'और अपने खुद के conclussions – Victor

उत्तर

150

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

एक इंटरफ़ेस मान कंक्रीट संरचना का मूल्य नहीं है (क्योंकि इसमें एक चर आकार है, यह संभव नहीं होगा), लेकिन यह एक प्रकार का सूचक है (संरचना के लिए एक पॉइंटर अधिक सटीक होना चाहिए और एक प्रकार के लिए सूचक)। रस कॉक्स बिल्कुल here यह वर्णन करता है:

इंटरफ़ेस मूल्यों एक दो शब्द जोड़ी प्रकार इंटरफ़ेस में संग्रहीत और संबद्ध डेटा के लिए सूचक के बारे में जानकारी के लिए सूचक देने के रूप में प्रतिनिधित्व कर रहे हैं।

enter image description here

यही कारण है कि Interface है, और नहीं *Interface सही प्रकार एक struct Interface को लागू करने के लिए सूचक धारण करने के लिए है।

तो आप बस का उपयोग करना चाहिए

var pi Interface 
+7

ठीक करते हैं, मुझे लगता है कि मेरे लिए समझ में आता है। मैं बस सोच रहा हूं कि क्यों (उस मामले में), यह 'var pi * इंटरफ़ेस' कहने के लिए बस एक संकलित समय त्रुटि नहीं है। –

+1

मैं इसे समझाने के लिए अधिक जानकारी में गया। संपादन देखें। मैं रसेल कॉक्स के आलेख I के लिंक को पढ़ने का सुझाव देता हूं। –

+0

@ सिमॉन निकर्सन: विभिन्न प्रकार के पॉइंटर्स एक दूसरे के बदले नहीं हैं।यदि वे थे, तो आप इंटरफ़ेस को लागू करने वाले किसी भी प्रकार के किसी भी मूल्य के साथ इंगित की गई चीज़ को ओवरराइट करने के लिए इंटरफ़ेस पॉइंटर का उपयोग कर सकते हैं, जो स्पष्ट रूप से अच्छा नहीं है – newacct

3

यह शायद है कि तुम क्या मतलब है:

package main 

type Interface interface{} 

type Struct struct{} 

func main() { 
     var ps *Struct 
     var pi *Interface 
     pi = new(Interface) 
     *pi = ps 

     _, _ = pi, ps 
} 

ठीक संकलित करता है। here भी देखें।

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