• 95. Go中runtime.Caller的使用


    runtime.Caller
    函数定义
    func runtime.Caller(skip int) (pc uintptr, file string, line int, ok bool)

    作用
    获取函数Caller的调用信息

    参数
    skip=0时: 返回调用Caller的函数A的pc(program counter)(A即runtime.Caller代码当前所在函数)、所在文件名以及Caller在函数A中的行数
    skip=1时: 返回调用函数A的函数B的pc、所在文件名以及函数A在函数B中的行数;以此类推

    pc: 程序计数器,指向下一条将要取指的指令地址
    file: pc对应的函数所在文件路径
    line: 被调用方在pc对应的函数中的行数

    示例:
    /Users/go/src/liyouming/golang-trick/40-clean-code-controll-flow/util/util.go

    package util
    
    import (
    	"bytes"
    	"fmt"
    	"runtime"
    )
    
    func CallerTest() {
    	for i := 0; i <= 4; i++ {
    		pc, file, line, ok := runtime.Caller(i)
    		if ok {
    			fmt.Printf("当i:=%d时:\n调用者的pc:%v\n调用者的函数名:%s\n"+
    				"调用者所在file:%s\n被调用者在调用者中的line:%d\n", i, pc, runtime.FuncForPC(pc).Name(), file, line)
    			fmt.Println(string(bytes.Repeat([]byte("*"), 10)))
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    main.go

    package main
    
    import (
    	"golang-trick/40-clean-code-controll-flow/util"
    )
    
    func main() {
    	util.CallerTest()
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行结果如下:

    当i:=0:
    调用者的pc:17363077
    调用者的函数名:golang-trick/40-clean-code-controll-flow/util.CallerTest
    调用者所在file:/Users/go/src/liyouming/golang-trick/40-clean-code-controll-flow/util/util.go
    被调用者在调用者中的line:11
    **********
    当i:=1:
    调用者的pc:17363702
    调用者的函数名:main.main
    调用者所在file:/Users/go/src/liyouming/golang-trick/40-clean-code-controll-flow/main.go
    被调用者在调用者中的line:8
    **********
    当i:=2:
    调用者的pc:16987729
    调用者的函数名:runtime.main
    调用者所在file:/usr/local/opt/go/libexec/src/runtime/proc.go
    被调用者在调用者中的line:250
    **********
    当i:=3:
    调用者的pc:17158656
    调用者的函数名:runtime.goexit
    调用者所在file:/usr/local/opt/go/libexec/src/runtime/asm_amd64.s
    被调用者在调用者中的line:1594
    **********
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    文件系统系列专题之 Ext2/3/4
    JVM线上监控环境搭建Grafana+Prometheus+Micrometer
    什么是虚拟DOM(Virtual DOM)?它在前端框架中的作用是什么?
    Kafak简单使用
    性能测试知识
    MyBatis——Plus基本的CRUD
    记录内网Docker启动Stable-Diffusion遇到的几个坑
    【教3妹学算法-每日1题】设计有序流
    【力扣刷题练习】93. 复原 IP 地址
    基于STM32和FreeRTOS的二值信号量实现任务同步
  • 原文地址:https://blog.csdn.net/YouMing_Li/article/details/136488620