2009-11-21 15 views
10

मैं जानना चाहता हूं कि यहां क्या हो रहा है।फ़ंक्शन कार्यान्वयन इंटरफ़ेस

type Handler interface { 
    ServeHTTP(*Conn, *Request) 
} 

इस कार्यान्वयन मुझे लगता है कि मैं समझता हूँ:

एक http हैंडलर के लिए इंटरफ़ेस है।

type Counter int 

func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) { 
    fmt.Fprintf(c, "counter = %d\n", ctr); 
    ctr++; 
} 

मेरी समझ से यह है कि "काउंटर" इंटरफ़ेस लागू करता है क्योंकि इसमें एक विधि है जिसमें आवश्यक हस्ताक्षर हैं। अब तक सब ठीक है। फिर यह उदाहरण दिया गया है:

func notFound(c *Conn, req *Request) { 
    c.SetHeader("Content-Type", "text/plain;", "charset=utf-8"); 
    c.WriteHeader(StatusNotFound); 
    c.WriteString("404 page not found\n"); 
} 

// Now we define a type to implement ServeHTTP: 
type HandlerFunc func(*Conn, *Request) 
func (f HandlerFunc) ServeHTTP(c *Conn, req *Request) { 
    f(c, req) // the receiver's a func; call it 
} 
// Convert function to attach method, implement the interface: 
var Handle404 = HandlerFunc(notFound); 

क्या कोई यह बता सकता है कि इन विभिन्न कार्यों को एक साथ क्यों या कैसे फिट किया जाता है?

उत्तर

12

यह:

type Handler interface { 
    ServeHTTP(*Conn, *Request) 
} 

का कहना है कि किसी भी प्रकार की जो संतुष्ट Handler इंटरफ़ेस एक ServeHTTP विधि होनी चाहिए। उपरोक्त पैकेज http के अंदर होगा।

type Counter int 

func (ctr *Counter) ServeHTTP(c *http.Conn, req *http.Request) { 
    fmt.Fprintf(c, "counter = %d\n", ctr); 
    ctr++; 
} 

यह काउंटर प्रकार पर एक विधि डालता है जो ServeHTTP से मेल खाता है। यह एक उदाहरण है जो निम्नलिखित से अलग है।

मेरी समझ से यह है कि प्रकार "काउंटर" इंटरफ़ेस लागू करता है, क्योंकि यह एक तरीका है कि आवश्यक हस्ताक्षर हैं है।

यह सही है।

अपने आप में निम्नलिखित समारोह एक Handler के रूप में काम नहीं करेगा:

func notFound(c *Conn, req *Request) { 
    c.SetHeader("Content-Type", "text/plain;", "charset=utf-8"); 
    c.WriteHeader(StatusNotFound); 
    c.WriteString("404 page not found\n"); 
} 

इस सामग्री के बाकी बस ऊपर ढाले जाता है ताकि वह एक Handler हो सकता है।

निम्नलिखित में, एक HandlerFunc एक समारोह जो दो तर्क, Conn करने के लिए सूचक और Request करने के लिए सूचक लेता है, और कुछ भी नहीं देता है। दूसरे शब्दों में, कोई भी फ़ंक्शन जो इन तर्कों को लेता है और कुछ भी नहीं देता है वह HandlerFunc हो सकता है।

func (f HandlerFunc) ServeHTTP(c *Conn, req *Request) { 
    f(c, req) // the receiver's a func; call it 
} 

सभी यह करता दिए गए तर्कों के साथ समारोह में ही (f) कॉल करने के लिए है:

// Now we define a type to implement ServeHTTP: 
type HandlerFunc func(*Conn, *Request) 

यहाँ ServeHTTP एक विधि प्रकार HandlerFunc को जोड़ा गया है।

// Convert function to attach method, implement the interface: 
var Handle404 = HandlerFunc(notFound); 

ऊपर लाइन में, notFound कृत्रिम रूप से एक प्रकार उदाहरण के समारोह के ही बाहर बनाने और उदाहरण के लिए ServeHTTP विधि में समारोह बनाकर Handler के लिए इंटरफेस के लिए स्वीकार्य अस्तित्व में finagled किया गया है। अब Handle404 का उपयोग Handler इंटरफ़ेस के साथ किया जा सकता है। यह मूल रूप से एक तरह की चाल है।

+0

ठीक है मुझे लगता है कि मुझे अब यह मिल गया है, जिस चीज ने मुझे फिसल दिया वह थाफलर हैंडलफनक का रूपांतरण था। प्रभावी जाने के रूपांतरण अनुभाग को फिर से पढ़ने के बाद यह अधिक स्पष्ट है कि यह फ़ंक्शंस पर भी कैसे लागू हो सकता है। http://golang.org/doc/effective_go.html#conversions – mbarkhau

1

आप दूसरी छमाही के बारे में वास्तव में क्या समझते हैं? यह उपरोक्त जैसा ही पैटर्न है। काउंटर प्रकार को एक int के रूप में परिभाषित करने के बजाय, वे नफ़ाउंड नामक फ़ंक्शन को परिभाषित करते हैं। फिर वे हैंडलरफनक नामक एक प्रकार का फ़ंक्शन बनाते हैं जो दो पैरामीटर, कनेक्शन और अनुरोध लेता है। फिर वे ServeHTTP नामक एक नई विधि बनाते हैं, जो हैंडलरफनक प्रकार से जुड़ा हुआ है। हैंडल 404 बस इस वर्ग का एक उदाहरण है जो नोफउंड फ़ंक्शन का उपयोग करता है।

+2

हाँ, यह सामान्य उच्च क्रम कार्यात्मक प्रोग्रामिंग है। यह पहली बार भ्रमित हो सकता है जब आप इसे देखते हैं और प्रकारों के माध्यम से अपना रास्ता काम करते हैं। – Suppressingfire

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