2010-08-30 11 views
36

मैं Google Go में पॉइंटर्स के बारे में सीख रहा था। और कुछ की तरह लिखने के लिए,क्या हमारे पास Google Go में फ़ंक्शन पॉइंटर्स हो सकते हैं?

func hello(){ 

     fmt.Println("Hello World") 
} 

func main(){ 

     pfunc := hello  //pfunc is a pointer to the function "hello" 
     pfunc()   //calling pfunc prints "Hello World" similar to hello function 
} 

वहाँ के रूप में ऊपर किया यह परिभाषित करने के बिना समारोह सूचक घोषित करने के लिए एक रास्ता है में कामयाब रहे? क्या हम कुछ लिख सकते हैं जैसे हम सी में करते हैं?

उदा। void (*pfunc)(void);

+5

मैं आपके सवाल का जवाब देने के लिए जाओ के बारे में पर्याप्त जानकारी नहीं है, लेकिन मैं एक counterquestion है: क्यों करेंगे जब आपके पास उचित प्रथम श्रेणी के कार्य होते हैं तो आप फ़ंक्शन पॉइंटर्स रखना चाहते हैं? –

+1

मुझे लगता है कि यह एक शैक्षणिक प्रश्न है। मेरे पास सी में पृष्ठभूमि है और अभी गो के बारे में सीखना शुरू कर दिया है। मैंने देखा कि गो के पास सी के समान पॉइंटर्स हैं और इसलिए सीखना चाहते थे कि क्या गो में फ़ंक्शन पॉइंटर्स संभव हैं और यदि हां, तो उन्हें कैसे घोषित करें। – Kevin

उत्तर

50

यदि आप हस्ताक्षर का उपयोग कर रहे हैं तो यह काम करता है। कोई सूचक नहीं है।

type HelloFunc func(string) 

func SayHello(to string) { 
    fmt.Printf("Hello, %s!\n", to) 
} 

func main() { 
    var hf HelloFunc 

    hf = SayHello 

    hf("world") 
} 

वैकल्पिक रूप से आप एक नया प्रकार घोषित किए बिना सीधे फ़ंक्शन हस्ताक्षर का उपयोग कर सकते हैं।

+0

कार्यों के लिए "प्रकार" के उपयोग की व्याख्या करने के लिए धन्यवाद म्यू। – Kevin

23

गो में सी और सी ++ के रूप में फ़ंक्शन पॉइंटर्स के लिए समान वाक्यविन्यास नहीं है। Go blog पर इसके लिए एक बहुत अच्छी व्याख्या है। समझा जा सकता है कि गो लेखकों ने सोचा कि फ़ंक्शन पॉइंटर्स के लिए सी का सिंटैक्स नियमित पॉइंटर्स के समान ही है, इसलिए संक्षेप में उन्होंने फ़ंक्शन पॉइंटर्स को स्पष्ट करने का निर्णय लिया; यानी अधिक पठनीय।

यहां एक उदाहरण मैंने लिखा है। ध्यान दें कि fp पैरामीटर को calculate() में परिभाषित किया गया है और नीचे दिया गया दूसरा उदाहरण आपको दिखाता है कि आप फ़ंक्शन पॉइंटर को किसी प्रकार में कैसे बना सकते हैं और इसे फ़ंक्शन (टिप्पणी की गई गणना फ़ंक्शन) में उपयोग कर सकते हैं।

package main 

import "fmt" 

type ArithOp func(int, int)int 

func main() { 
    calculate(Plus) 
    calculate(Minus) 
    calculate(Multiply) 
} 

func calculate(fp func(int, int)int) { 
    ans := fp(3,2) 
    fmt.Printf("\n%v\n", ans) 
} 

// This is the same function but uses the type/fp defined above 
// 
// func calculate (fp ArithOp) { 
//  ans := fp(3,2) 
//  fmt.Printf("\n%v\n", ans) 
// } 

func Plus(a, b int) int { 
    return a + b 
} 

func Minus(a, b int) int { 
    return a - b 
} 

func Multiply(a,b int) int { 
    return a * b 
} 

fp पैरामीटर एक समारोह है कि दो ints लेता है और एक भी पूर्णांक रिटर्न के रूप में परिभाषित किया गया है। यह कुछ हद तक एक ही बात है Mue उल्लेख किया गया है लेकिन एक अलग उपयोग उदाहरण दिखाता है।

+0

धन्यवाद हंससन। – Kevin

+0

मुझे लगता है कि आप उस ब्लॉग पोस्ट को गलत तरीके से पढ़ रहे हैं। यह नहीं कह रहा है कि फ़ंक्शन पॉइंटर्स को "अनुमत" नहीं है, बल्कि उनके पास सी – poolie

+0

में एक अलग घोषणा वाक्यविन्यास है, मैं गलत नहीं पढ़ रहा था; मेरे पास सिर्फ शब्दों की खराब पसंद थी :) – hannson

4

आप इस तरह यह कर सकता है:

package main 

import "fmt" 

func hello(){ 

     fmt.Println("Hello World") 
} 

func main(){ 
     var pfunc func() 
     pfunc = hello  //pfunc is a pointer to the function "hello" 
     pfunc()    
} 

अपने समारोह तर्क हैं और जैसे हैं एक वापसी मान, यह दिखाई देगा:

func hello(name string) int{ 

     fmt.Println("Hello %s", name) 
     return 0 
} 

और की तरह चर दिखेगा:

var pfunc func(string)int 
संबंधित मुद्दे