首页 > 其他分享 > 一个思路:实现 golang 中的 `__file__` `__line__` 宏

一个思路:实现 golang 中的 `__file__` `__line__` 宏

时间:2023-09-27 14:36:31浏览次数:44  
标签:__ arr golang file line SourceCodeLoc strings

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


测试 zaplog 发现,开启 caller 的调用,会使整个服务增加 2% 的损耗。
其实文件及其行号完全可以在编译期加上去,没必要带来运行期的性能损耗。

因此有一个思路,可以解决这个问题:

1.获取源码行的代码:

package debug

import (
	"fmt"
	"runtime"
	"strings"
)

// SourceCodeLoc 获取源码行
func SourceCodeLoc(callDepth int) string {
	_, file, line, ok := runtime.Caller(callDepth)
	if !ok {
		return ""
	}
	file = strings.ReplaceAll(file, "\\", "/")
	arr := strings.Split(file, "/")
	if len(arr) > 3 {
		file = strings.Join(arr[len(arr)-3:], "/")
	}
	return fmt.Sprintf("%s:%d", file, line)
}

2.在代码中输出行号:

func xxx(){
    if err!=nil{
        return fmt.Errorf("[%s]error detail=%s", debug.SourceCodeLoc(1), err.Error())
    }
}

3.编译前

开发一个工具,在编译前把所有的 debug.SourceCodeLoc(1) 替换为文件中的文件和行号。然后再 go build.

近期会写这样一个工具出来。

标签:__,arr,golang,file,line,SourceCodeLoc,strings
From: https://www.cnblogs.com/ahfuzhang/p/17732634.html

相关文章

  • Qt实现录屏功能,支持录制视频和gif
    最近在调试工程的时候,看到项目中使用opencv的方式进行录制软件界面视频,于是有了一个想法,做一个录屏的功能结合了视频录制和gif录制。界面比较简单,就支持选择录制视频还是gif,以及帧率选择。以及录制时候,不允许改变客户端大小,只能录制点击录制前的,客户端中透明区域所在的屏幕。界......
  • 十字星
    十字星十字星代表市场的转折就要来了概念:开盘价和收盘价接近,并带有上下影线的都可以成为十字星意义:代表的是买卖双方力量的一种平衡影线:说明多空双方经过一轮对决,影线越长说明多空分歧越大实体:小,多空双方开展了激烈的博弈1.黄昏十字星说明:前一天出现了4个点以上的......
  • IServiceCollection”未包含“AddSwaggerGen”的定义
      记录一下今天在删除依赖的时候,明明删除的不需要依赖包,没有删除AddSwagger所依赖的三个文件,这个包包含这三个文件分别是:   有三个主要的组成部分:Swashbuckle.AspNetCore.Swagger 一个大摇大摆的对象模型和中间件SwaggerDocument 作为JSON端点的对象。Swashbuc......
  • Pycharm安装bs4第三方库出错
    昨日正好写的demo需要bs4包,然而安装该库出现了许多问题,下面是复盘以及解决方式(最后直达)。直接安装:点击file(文件)->setting设置进入下界面后,找到自己的项目中的PythonInterperter,发现确实没有bs4,当然就想到进行安装。 点击右上角的加号进入AvailablePackages界面,即可寻找......
  • 星期三。
    关于reques对象使用的常用方法读取输入数据 String  getParameter   //(表单中的name值)获得提交的参数(⼀个name对应⼀个value)String[]  getParameterValues      //(表单中的name值) 获得提交的参数(⼀个name对多个value) Map<String,String[]>  ......
  • 低功耗引擎 Cliptrix 有什么价值
    在万物互联的时代,现代人已普遍接受电视、音箱等电器设备具备智能化能力,也是在这个趋势下,我们身边越来越多的iOT设备联网和交互成为刚需。但iot设备也面临到一些非常显著的痛点,例如iot设备的内存、处理器等核心元件无法与手机、电脑等高端的智能化设备相比,很难直接运行一些大型......
  • 分布式事务
    分布式事务传统数据库事务一,什么是事务事务是指单个逻辑工作单元执行得一系列操作,要么都做,要么都不做,是不可分割的工作单位,是数据库环境中的的最小工作单元二、为什么需要事务?事务包含了一组操作,这些操作可以是一条SQL语句、一组SQL语句或整个程序。如果其中一个操作不成功,......
  • 高效程序员的45个习惯
                ......
  • 龙芯编译libiconv
    系统版本:4.19.0-loongson-3-desktop loongarch64GNU/Linux 编译renderdoc时报错/usr/bin/ld:找不到-liconv,需手工下载libiconv代码编译:wgethttps://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gztar-zxvflibiconv-1.15.tar.gzcdlibiconv-1.15/./config......
  • Android上层WatchDog学习笔记_2
    一、简述1.了解WatchDog的原理,可以更好的理解系统服务的运行机制。二、WatchDog实现1.代码实现位置//frameworks/base/services/core/java/com/android/server/Watchdog.javapublicclassWatchdogextendsThread{...}可见Watchdog是一个线程。2.WatchDo......