安全编码案例(52)go结构体方法未使用指针,结构体实例的锁失效
摘要:go结构体方法未使用指针,结构体实例的锁失效
【问题描述】
go结构体方法未使用指针,结构体实例的锁失效
【错误代码片段】
给结构体定义一把锁
在函数中调用锁
实测锁失效,仍存在资源竞争,导致请求失败的情况
【原因分析及推荐写法】
结构体方法中未使用指针,参数传入方式是拷贝一个新实例c,因此,每次调用方法时,新实例c的锁都不一样。
1、试验–结构体方法不使用指针
【POC代码】
可以发现锁失效,两个方法调用的锁的地址不一样
2、试验–结构体方法使用指针
【POC代码】
可以发现锁成功,调用的锁相同
3、试验–如果不使用指针,则需要Locker方式实现锁sync.Locker
是一个接口,在初始化实例时,可以传入一个锁的指针
锁有效
但还是推荐在结构体方法中使用指针
【总结】
1、结构体方法中不使用指针,参数传入方式是拷贝一个新实例c,无法有效操作实例中的成员变量
2、建议使用指针,在结构体的成员方法中允许修改该结构体的成员变量是合理的。且如果结构体足够大,使用指针可以加快效率。
本文来自博客园,作者:易先讯,转载请注明原文链接:https://www.cnblogs.com/gongxianjin/p/17206774.html