记录一次go的panic (function arguments too large for new goroutine)

概述

当前程序中有一段创建任务的代码,由于之前任务逻辑不复杂,任务存储的结构体字段较少。后续业务越来越复杂,结构体嵌套结构体得到了一个非常大的结构体Task。然后启动新协程的时候,copy了一份task的副本,导致参数超过了新goroutine的可用堆栈空间。 goroutine默认分配2k的内存。

伪代码

func CreateTask() {
	//初始化任务信息,大量的逻辑代码
	// ......
	var task model.Task
	err = setTaskInfo(&params, &task)
	unsafe.Sizeof(task) // 这时task的大小已超过了2k了

	// 直接panic了
	go RecordTaskStartLogInfo(task)
	// 下面两种方式没有该问题,后续若修改原task内容无影响,建议传指针
	/*go func(){
		RecordTaskStartLogInfo(task)
	}()
	go RecordTaskStartLogInfo(&task)*/

	return
}

总结

结构体嵌套结构体,使用时一定要注意,结构体副本所占用的空间会越来越大,结构体嵌套结构体,能不用最好不要用这种方式。如果一定要使用,可以使用指针来替代副本做参数传递。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值