与“该用”相关的TAG标签
Task.Run适合CPU密集型工作(如计算、图像处理),避免阻塞UI;HTTP/文件等I/O操作应优先用原生async方法;不可在Task.Run中包裹await表达式或async方法而不await。
goroutine泄漏典型表现为内存持续上涨、CPU不降及pprof显示大量goroutine阻塞在chanreceive/select;定位需用runtime.NumGoroutine()打点日志并访问/debug/pprof/goroutine?debug=2查堆栈。
该用设计模式当且仅当:同一逻辑在三个以上上下文重复出现、不抽象会导致多处修改、新人能通过接口名快速理解职责;否则属过度设计。
该用errors.New时是需固定无变量错误描述且要轻量安全比较的场景;它不支持格式化和错误链,而fmt.Errorf通过%w动词实现标准错误包装与上下文嵌入,语义更清晰。
SpinWait.SpinUntil仅适用于等待极短时间内(微秒级)即可满足的轻量条件,如无锁结构中轮询volatile或Interlocked变量;不可用于I/O、网络、定时器等场景,且必须显式指定超时,谓词须无副作用、不阻塞、不分配。
该用指针传参当结构体较大(字段超4–5个,含[]byte、map、slice等)以减少拷贝开销;小结构体传值更高效;切片、map、chan本身轻量,无需额外加星号;避免不必要的指针导致逃逸和GC压力。
Go数组传参是值传递,会完整复制整个内存块;应优先使用slice(仅传24字节)替代,大数组必须用指针传递或堆分配。
该用*T而不是T的情况包括:需修改原值、结构体含不可复制字段(如sync.Mutex)、体积大或字段多、实现指针接收者接口、JSON中需区分“未设置”与“设为零”、map中需修改原对象。
结论:用std::unique_ptr管理独占资源,用std::shared_ptr管理共享资源;必须用make_unique/make_shared创建,禁止裸new;unique_ptr可移转为shared_ptr,反之不行;注意循环引用、所有权边界和数组删除器。
goroutine中的panic必须在内部用recover捕获,因为panic不跨协程传播,子协程panic后静默退出,主协程不受影响但可能导致数据丢失、资源泄漏、任务中断且无日志;recover仅在本协程defer中有效,需配合debug.Stack()结构化记录并及时退出,不可继续执行业务逻辑。
