golang开发效率小技巧之gopatch

开发中,我们会遇到批量加入或者替换某一些代码的场景,可以使用 uber gopatch

举个栗子

  1. 比如在下面的代码里,有开协程的代码块,但是没有加recover 功能,需要一个一个向每个文件加入太麻烦。今天的主角gopatch就可以解决这类问题。

以code目录下有 a.go 和b.go 文件为例

//A a.go
func A() {
	// ...
	fmt.Println(`A function`)
	go func() {
		fmt.Println(`A goroutine`)
	}()
	//...
}
//B b.go
func B() {
	// ...
	fmt.Println(`B function`)
	go func() {
		fmt.Println(`B goroutine`)
	}()
	//...
}

我们想要达到下面这种效果


//A a.go
import (
"fmt"
"log"
"runtime/debug"
)

func A() {
// ...
fmt.Println(`A function`)
go func() {
  defer func() {
    if err := recover(); err != nil {
      log.Printf("{{ FileName }} recover from panic, err=%+v, stack=%v", err, string(debug.Stack()))
    }
  }()
log.Flags()
fmt.Println(`A goroutine`)
}()
//...

}
------

//B b.go
import (
"fmt"
"log"
"runtime/debug"
)
func B() {
// ...
fmt.Println(`B function`)
go func() {
  defer func() {
  if err := recover(); err != nil {
    log.Printf("{{ FileName }} recover from panic, err=%+v, stack=%v", err, string(debug.Stack()))
  }
}()
fmt.Println(`B goroutine`)
}()
//...
}

首先我们需要写patch 文件,命名为 recover.patch
内容如下

@@
@@
+ import "runtime/debug"
+ import "log"

go func(...) {
+    defer func(){
+        if err := recover(); err != nil {
+            log.Printf("{{ FileName }} recover from panic, err=%+v, stack=%v", err, string(debug.Stack()))
+        }
+    }()
  ...
}()

接下来,我们就能执行命令了

gopatch -p ./recover.patch ./code/...

命令中的 ./… 有关说明可以看 golang … 之 ./…

再去看一下go文件。就达到我们批量加入的需求了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值