2011-08-13 28 views

Trả lời

95

Xin lỗi vì đã trả lời câu hỏi của riêng tôi, nhưng tôi đã tìm thấy một giải pháp:

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

Trong khi điều này dường như hoạt động, một số dịch vụ có thể được yêu cầu ở đây: tài liệu cho .Pointer() nói "Nếu v's Kind là Func, con trỏ trả về là con trỏ mã cơ bản, nhưng không nhất thiết phải xác định một hàm duy nhất. chỉ đảm bảo rằng kết quả bằng 0 nếu và chỉ khi v là một giá trị nil func. " – jochen

+0

@jochen hiện "không phải là một func đơn" có nghĩa là nó có thể trả về các kết quả dương tính giả (tức là con trỏ của một hàm khác)? – themihai

+0

@themihai Tôi không biết, câu tôi trích dẫn là tất cả các tài liệu tại https://golang.org/pkg/reflect/#Value.Pointer nói về điều này. Nhưng báo giá dường như chỉ ra rằng người ta có thể nhận được cùng một con trỏ cho các chức năng khác nhau, phải không? Và nếu trường hợp này xảy ra, 'GetFunctionName' có thể trả về cùng tên cho các hàm khác nhau? – jochen

5

Không chính xác những gì bạn muốn, bởi vì nó có thể ghi tên tập tin và số dòng, nhưng đây là cách tôi làm điều đó tại Gò Thư viện thường không dễ chịu Tideland tôi (http://tideland-cgl.googlecode.com/) bằng cách sử dụng "thời gian chạy" gói:

+0

Điều đó không thực sự hữu ích. Tôi không cần lấy thông tin về ngăn xếp cuộc gọi, mà là về một hàm nhất định. Tôi tin rằng câu hỏi sẽ được trả lời nếu tôi biết làm thế nào để có được các máy tính tương ứng cho một tham chiếu chức năng (nếu có thể). – moraes

Các vấn đề liên quan