func SafeGoroutineWithRequestID(f func(), requestID string) {

	defer func() {

		if err := recover(); err != nil {
			stack := Stack(3)
			logger.LogErrorf("[Recovery] %s %s panic recovered:\n%s\n%s", time.Now().Format("2006/01/02 - 15:04:05"), err, stack, false)
		}
	}()
	logger.SetLogId(requestID)
	f()
}

把函数当成参数传入进来,并且传入requestID。这时候就把recover 这一层抽象出来了。
但是问题来了。没有带参数的函数能够很好的放入到这个函数中。比如

func testPanic(){
    x, y := 100, 0
	c := x/y
	fmt.Println(c)
}

如果这个时候传入参数 y 是0 就会触发panic。但是这种函数没有入参。有入参又要怎么处理呢?

使用闭包的方式就可以处理了。
比如上面的comparefee 函数。

f := func() {
		compareV2ShippingFee(ctx, currentResult, data, calculateData, requestID)
	}
	go apiutils.SafeGoroutineWithRequestID(f2, requestID)

使用这种方式就饿能够达到目的。
至此,就能够愉快的开协程了。

到此这篇关于“golang 开启协程”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!