কীভাবে কোনও ফাংশনের নাম পাবেন?


104

একটি ফাংশন দেওয়া হয়েছে, এটির নাম পাওয়া কি সম্ভব? বলুন:

func foo() {
}

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

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

আমাকে বলা হয়েছিল রানটাইম.ফানকফরপিসিসি সাহায্য করবে, তবে কীভাবে এটি ব্যবহার করতে হয় তা বুঝতে আমি ব্যর্থ হয়েছি।

উত্তর:


194

আমার নিজের প্রশ্নের উত্তর দেওয়ার জন্য দুঃখিত, তবে আমি একটি সমাধান পেয়েছি:

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))
}

4
যদিও এটি কাজ করে বলে মনে হচ্ছে, এখানে কিছু যত্নের প্রয়োজন হতে পারে: পয়েন্টার () এর জন্য ডকুমেন্টেশনতে বলা হয়েছে "যদি ভি এর ধরণটি ফানক হয় তবে প্রত্যাবর্তিত পয়েন্টারটি অন্তর্নিহিত কোড পয়েন্টার, তবে একক ফাংশনটি অনন্যভাবে চিহ্নিত করার জন্য পর্যাপ্ত নয় only কেবলমাত্র গ্যারান্টিটি হ'ল ফলাফলটি শূন্য হয় এবং কেবলমাত্র ভি যদি শূন্যের মান হয় ""
জোচেন

4
@ জোচেন "" একটি ফানক নয় "এর অর্থ কি এটি মিথ্যা ধনাত্মকতা (অর্থাত্ কোনও ভিন্ন কার্যের পয়েন্টার) ফিরিয়ে দিতে পারে?
থিসিহাই

4
@ থেমিহাই আমি জানি না, আমি যে বাক্যটি উদ্ধৃত করেছি তা হ'ল ডকুমেন্টগুলি golang.org/pkg/reflect/#Value.Pointer এ সম্পর্কে বলে। কিন্তু উদ্ধৃতিটি ইঙ্গিত দেয় বলে মনে হচ্ছে যে বিভিন্ন ফাংশনের জন্য একই পয়েন্টারটি পাওয়া যায়, তাই না? এবং যদি এটি হয় তবে GetFunctionNameবিভিন্ন ফাংশনের জন্য একই নামটি ফিরে আসতে পারে?
জোচেন 21 শে

4
@ জোচেন আমি মনে করি এটি বন্ধের সাথে করা উচিত; যদি আপনি দুটি ক্লোজার তৈরি করেন যার একই অন্তর্নিহিত ফাংশন রয়েছে তবে তারা সমান হবে যদি তারা যে মানগুলি বন্ধ করে দেয় সেগুলি পৃথক হয়।
অ্যালেক্স গুয়েরা

9

আপনি যা চান ঠিক তা নয়, কারণ এটি ফাইলের নাম এবং লাইন নম্বরটি লগ করে, তবে আমি এখানে আমার টাইডল্যান্ড কমন গো লাইব্রেরিতে ( http://tideland-cgl.googlecode.com/ ) "রানটাইম" প্যাকেজটি ব্যবহার করে কীভাবে করব:

// Debug prints a debug information to the log with file and line.
func Debug(format string, a ...interface{}) {
    _, file, line, _ := runtime.Caller(1)
    info := fmt.Sprintf(format, a...)

    log.Printf("[cgl] debug %s:%d %v", file, line, info)

4
এটি সত্যিই সাহায্য করে না। আমার কল স্ট্যাক সম্পর্কে তথ্য পাওয়ার দরকার নেই, তবে প্রদত্ত ফাংশন সম্পর্কে। আমি বিশ্বাস করি যে কীভাবে সম্পর্কিত পিসিকে কোনও ফাংশন রেফারেন্স দেওয়া সম্ভব (যদি সম্ভব হয়) তবে এই প্রশ্নের উত্তর দেওয়া হবে।
মোড়গুলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.