2011-08-13 18 views
56

एक समारोह को देखते हुए, क्या इसका नाम प्राप्त करना संभव है? कहते हैं:गो में किसी फ़ंक्शन का नाम कैसे प्राप्त करें?

func foo() { 
} 

func GetFunctionName(i interface{}) string { 
    // ... 
} 

func main() { 
    // Will print "name: foo" 
    fmt.Println("name:", GetFunctionName(foo)) 
} 

मुझे बताया गया था कि runtime.FuncForPC में मदद मिलेगी, लेकिन मैं समझता हूँ कि यह कैसे उपयोग करने के लिए विफल रहा है।

उत्तर

95

मेरे अपने प्रश्न का उत्तर देने के लिए खेद है, लेकिन मुझे एक समाधान मिला:

package main 

import (
    "fmt" 
    "reflect" 
    "runtime" 
) 

func foo() { 
} 

func GetFunctionName(i interface{}) string { 
    return runtime.FuncForPC(reflect.ValueOf(i).Pointer()).Name() 
} 

func main() { 
    // This will print "name: main.foo" 
    fmt.Println("name:", GetFunctionName(foo)) 
} 
+0

हालांकि यह काम करता प्रतीत होता है, कुछ देखभाल की आवश्यकता हो सकती है: पॉइंटर() के लिए प्रलेखन "यदि वी का प्रकार Func है, तो लौटा हुआ सूचक एक अंतर्निहित कोड सूचक है, लेकिन एक समारोह को विशिष्ट रूप से पहचानने के लिए पर्याप्त रूप से पर्याप्त नहीं है। केवल गारंटी यह है कि नतीजा शून्य है और केवल तभी यदि v एक nil func मान है। " – jochen

+0

@jochen "एक भी func नहीं" का मतलब है कि यह झूठी सकारात्मक वापसी कर सकता है (यानी एक अलग समारोह के सूचक)? – themihai

+0

@themihai मुझे नहीं पता, मैंने जो वाक्य उद्धृत किया है वह सभी दस्तावेज़ हैं https://golang.org/pkg/reflect/#Value.Pointer इसके बारे में कहते हैं। लेकिन उद्धरण यह इंगित करता है कि किसी को अलग-अलग कार्यों के लिए एक ही सूचक मिल सकता है, है ना? और यदि ऐसा है, तो 'GetFunctionName' अलग-अलग कार्यों के लिए समान नाम वापस कर सकता है? – jochen

5

नहीं आप क्या चाहते हैं, क्योंकि यह फ़ाइल नाम और लाइन नंबर, लॉग, लेकिन यहाँ मैं अपने Tideland आम जाओ लाइब्रेरी (http://tideland-cgl.googlecode.com/) में यह करना है "क्रम" पैकेज का उपयोग:

+0

यह वास्तव में मदद नहीं करता है। मुझे कॉल स्टैक के बारे में जानकारी प्राप्त करने की आवश्यकता नहीं है, लेकिन किसी दिए गए फ़ंक्शन के बारे में। मेरा मानना ​​है कि सवाल का उत्तर दिया जाएगा यदि मुझे पता था कि संबंधित पीसी को फ़ंक्शन संदर्भ दिया गया है (यदि यह संभव है)। – moraes

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