Получить тип приемника и имя метода только из ссылки на функцию в Go - PullRequest
0 голосов
/ 28 ноября 2018

Учитывая кодовую настройку, подобную этой,

package main

import (
    "fmt"
    "reflect"
    "runtime/debug"
)

type A struct{}

func (o *A) B() error {
    debug.PrintStack()
    return nil
}

func main() {
    a := &A{}
    b := a.B

    // Note that if run b(), it can print the stack and show the info 
    // "(*A).B-fm" and "(*A).B"

    m := reflect.ValueOf(b)
    fmt.Println(m.Type().String())
}

Возможно ли получить информацию о приемниках b типа A и B в качестве метода?Как, если возможно?

Обратите внимание, что b является значением метода B типа A.

(Возможный сценарий использования, генерация постоянного уникального идентификатора API на основе только такой ссылки, как b, путемформирует строку наподобие (* A) .B . Он используется для создания инструмента отладки без необходимости изменения существующего кода.)

update:

1 Ответ

0 голосов
/ 28 ноября 2018

Это сделает работу.

fmt.Println(runtime.FuncForPC(m.Pointer()).Name())

Кредиты на эту потрясающую статью ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...