Тип runtime.Func

Тип runtime.Func представляет функцию в рантайме Go. Он используется для получения информации о функции во время выполнения программы. Основное применение этого типа связано с получением имени функции и её исходного кода. Тип runtime.Func возвращается функцией runtime.FuncForPC, которая принимает указатель на программный счетчик (program counter) и возвращает соответствующий объект runtime.Func.

Синтаксис

Тип runtime.Func определяется следующим образом:

gotype Func struct {
  // содержит скрытые поля
}

Основные методы типа runtime.Func:

gofunc (f *Func) Name() string
func (f *Func) Entry() uintptr
func (f *Func) FileLine(pc uintptr) (file string, line int)

Пример

Давайте получим информацию о текущей функции с помощью runtime.Func:

gopackage main

import (
  "fmt"
  "runtime"
)

func main() {
  pc, _, _, _ := runtime.Caller(0)
  fn := runtime.FuncForPC(pc)
  fmt.Println(fn.Name())
}

Результат выполнения кода:

go"main.main"

Пример

Давайте получим имя и точку входа для функции:

gopackage main

import (
  "fmt"
  "runtime"
)

func testFunc() {
  fmt.Println("test function")
}

func main() {
  pc := reflect.ValueOf(testFunc).Pointer()
  fn := runtime.FuncForPC(pc)
  fmt.Println(fn.Name())
  fmt.Println(fn.Entry())
}

Результат выполнения кода:

go"main.testFunc"
"17445632"

Пример

Давайте получим информацию о файле и строке для определенного программного счетчика:

gopackage main

import (
  "fmt"
  "runtime"
)

func main() {
  pc := make([]uintptr, 1)
  runtime.Callers(1, pc)
  fn := runtime.FuncForPC(pc[0])
  file, line := fn.FileLine(pc[0])
  fmt.Println(file)
  fmt.Println(line)
}

Результат выполнения кода:

go"/tmp/main.go"
"9"

Смотрите также

  • функцию runtime.Caller,
    которая возвращает информацию о вызывающей функции
  • функцию runtime.Callers,
    которая заполняет срез программными счетчиками
  • функцию runtime.FuncForPC,
    которая возвращает объект runtime.Func для программного счетчика
  • тип runtime.Frame,
    который представляет фрейм стека вызовов