不知道大家还记不记得,上次发了一篇关于 panic 检测机器人的文章,原理非常简单,简单回顾一下:

  1. 业务服务在 recover 函数里通过 HTTP 请求的方式向机器人上报 panic 栈信息。

  2. 机器人解析出 panic 栈里的代码行号,调用 gitlab 接口拿到该行代码的提交人、提交日期等信息。

当然,后面我又给机器人增加了一些其他的功能,例如自动拉群,自动提醒相关人修复 panic 代码等……

上面说的这些其实都很好实现,主要就是和飞书 API 打交道,再加上一些逻辑串连一下流程。目前机器人上报了 1000+ 次 panic,工作状态良好。

但偶尔还是有一些小问题的存在,例如有人用开发分支(非 master)上到线上测试环境(只读环境)测试一把,这时机器人还是用 master(默认)分支请求 gitlab 接口拿 commit 信息,拿到的信息就有可能不准。

那有没有什么好的方法能拿到正在运行的进程的代码分支呢?如果能拿到,机器人用代码路径+代码行号+代码分支,就可以从 gitlab 拿到正确的 commit 信息。

答案是有,通过 go build -X 注入。

那具体怎么玩的呢,通过一个小例子来说明。

下面是 build.sh 的代码:

#!/bin/shCOMMIT_ID=`git log |head -n 1| awk '{print $2;}'`
AUTHOR=`git log |head -n 3| grep Author| awk '{print $2;}'`
BRANCH_NAME=`git branch | awk '/\*/ { print $2; }'`
SERVICE_INFO="$COMMIT_ID,$AUTHOR,$BRANCH_NAME"
echo $SERVICE_INFO
go build -ldflags "-X codebase/build-x/compile_info.ServiceInfo=$SERVICE_INFO" -o output/bin/build

第 3、4、5 行分别用 git 命令拿到本次提交的 commit-id,author,分支名;第 6 行用 “,” 将三者组合成一个字符串;第 8 行用 go build 命令,设置 ldflags,将变量 $SERVICE_INFO 注入到包变量 codebase/build-x/compile_info.ServiceInfo,这样在 Go 代码中就可以直接用了。

再看看我的 compile_info 包的代码,非常简单,就定义了一个变量:

package compile_infovar ServiceInfo string

执行完 go build 命令后,compile_info.ServiceInfo 就会被赋上值,在 main 函数里打印一下:

package mainimport ("fmt""codebase/build-x/compile_info"
)func init() {fmt.Println("init: ", compile_info.ServiceInfo)
}func main() {fmt.Println(compile_info.ServiceInfo)
}

先执行:

sh build.sh

再执行:

~/go/src/codebase/build-x$ ./output/bin/build

得到运行结果:

init:  9699dcaae31e7e5eab55a1d75283a6d7158a64e8,raoquancheng,master
9699dcaae31e7e5eab55a1d75283a6d7158a64e8,raoquancheng,master

可知,在 init 函数里我们就可以拿到 compile_info.ServiceInfo 的值了。

代码文件结构如下:

文件结构

原理也没啥可探究的,就是通过 -ldflags 给链接器传参数:

-X definition: 添加形式为 importpath.name=value 的字符串值定义

其他的一些常见的命令用处:

-s 的作用是去掉符号信息。-w 的作用是去掉调试信息。go build -ldflags "-s -w" -o xxx

之前看到公司项目里 build 脚本里的一些命令不知道有啥用,真正到了用的时候才惊呼:原来是这样!

今天的 go build 妙用你学会了吗?也许下次就可以在同事面前装 B 了,当然如果碰到了老司机,也可能会被打脸。


资料分享,关注公众号回复指令:

  • 回复【加群】,和大佬们一起成长。

  • 回复【000】,下载一线大厂简历模板。

  • 回复【001】, 送你 Go 开源电子书。

go build -X 的妙用相关推荐

  1. SpringBoot2.x Nacos RocketMQ 事务消息

    需求背景: 现在有内容中心(content-center)和 用户中心(user-center)2个微服务,请求内容中心,发送消息给用户中心,完成为指定用户添加积分操作. 文章目录 一.准备工作 1. ...

  2. 三消也玩策略?这款游戏没那么简单——《妙连千军》

    在笔者的印象中,最开始接触三消类作品(Match 3)还是在早期的8bit机上,那是红遍一时的<马里奥医生>.玩家通过堆积色泽相同的胶囊,以此做到消灭瓶子中对应色泽的病菌.这种好似< ...

  3. httpclient妙用一 httpclient作为客户端调用soap webservice(转)

    前面有一篇使用HttpClient调用带参数的post接口方法,这里找到一篇使用HttpClient调用Soap协议接口的方式. 原文地址:httpclient妙用一 httpclient作为客户端调 ...

  4. 用户自定义属性表结构设计_属性类型定制及其妙用

    引擎版本 4.22.0 属性类型定制简介 在介绍属性类型定制前先了解下引擎提供的默认的详细布局. 默认详细布局 只要我们的UPROEPRTY类型是值类型,编辑器系统就会在详细面板为你创建一个默认布局. ...

  5. 万能的APT!编译时注解的妙用

    转载自:http://zjutkz.net/2016/04/07/万能的APT!编译时注解的妙用/ 本篇文章会带你了解什么是注解,注解的用法和分类,并且从knight和butterKnife的使用方式 ...

  6. 小团队如何妙用 JuiceFS

    早些年还在 ENJOY 的时候, 就已经在用 JuiceFS, 并且一路伴随着我工作过的四家小公司, 这玩意对我来说, 已经成了理所应当不可或缺的基础设施, 对于我服务过的小团队而言, 更是实实在在的 ...

  7. go build 编译报错 missing go.sum entry for module providing package

    go build 编译报错 missing go.sum entry for module providing package 解决方法 // 移除未使用的依赖 go mod tidy 再次编译,就可 ...

  8. 妙用postman系列——postman建组、分享

    妙用postman系列--postman建组.分享 添加新的组和请求. 3.生成分享链接 4.导入分享链接

  9. relay.build调用关系

    relay.build调用关系 在用TVM优化过程中,常见demo如下图: relay.build背后的调用机制梳理如下: python中的build函数实现如下,此方法实际调用了BuildModul ...

最新文章

  1. 程序员必备的20个软件
  2. 华为用MySQL还是oracle_25.Oracle和Mysql的区别
  3. 武汉首座无人驾驶电动汽车充电站投入使用
  4. Java扫描注解下的包_使用Spring mvc 利用java的反射技术,来扫描对应包下的注解请求url 统一保存在数据库中...
  5. go语言能编android程序吗,用 Golang 开发 Android 应用(二)—— 简单 UI-Go语言中文社区...
  6. neo4j 显示名字_Neo4j:绘制“我的名字是……我在工作”图
  7. DataGridView直接导出EXCEL
  8. Executor源码解读
  9. linux路由内核实现分析(四)---路由缓存机制(2)
  10. ASp.net常用服务
  11. (十五)洞悉linux下的Netfilteriptables:开发自己的hook函数【实战】
  12. Linux C编程学习之路
  13. FTP服务器文件下载方法
  14. Java编写杨辉三角
  15. Latex参考文献问题---参考文献条数不显示
  16. Google Map街景(红蓝立体)
  17. 十余年陪伴NS-2的心得体会
  18. Oracle EBS Workflow 下载/上传
  19. FocalLoss原理通俗解释及其二分类和多分类场景下的原理与实现
  20. 电脑声道,如何查看电脑声卡是几声道的?

热门文章

  1. windows环境下设置Redis自启动
  2. The 'microsoft.jet.oledb.4.0' provider is not registered on the local machin
  3. leetcode-125-Valid Palindrome
  4. linux中shell变量$#,$@,$0,$1,$2的含义解释:
  5. 使用Struts 2框架实现文件下载
  6. 10天学安卓-第九天
  7. mysql innodb 数据恢复
  8. 2021HDU多校8 - 7057 Buying Snacks(矩阵快速幂套NTT优化dp)
  9. CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)
  10. CodeForces - 1304D Shortest and Longest LIS(构造+贪心)