安全编码案例(52)go结构体方法未使用指针,结构体实例的锁失效

摘要:go结构体方法未使用指针,结构体实例的锁失效

【问题描述】

go结构体方法未使用指针,结构体实例的锁失效

【错误代码片段】

给结构体定义一把锁
image.png

在函数中调用锁
image.png

实测锁失效,仍存在资源竞争,导致请求失败的情况

image.png

【原因分析及推荐写法】

结构体方法中未使用指针,参数传入方式是拷贝一个新实例c,因此,每次调用方法时,新实例c的锁都不一样。
image.png

1、试验–结构体方法不使用指针
【POC代码】
image.png

image.png

可以发现锁失效,两个方法调用的锁的地址不一样
image.png

2、试验–结构体方法使用指针
【POC代码】
image.png

可以发现锁成功,调用的锁相同
image.png

3、试验–如果不使用指针,则需要Locker方式实现锁
sync.Locker是一个接口,在初始化实例时,可以传入一个锁的指针
image.png

锁有效
image.png

但还是推荐在结构体方法中使用指针

【总结】

1、结构体方法中不使用指针,参数传入方式是拷贝一个新实例c,无法有效操作实例中的成员变量

2、建议使用指针,在结构体的成员方法中允许修改该结构体的成员变量是合理的。且如果结构体足够大,使用指针可以加快效率。

posted @ 2023-03-11 19:28  易先讯  阅读(13)  评论(0编辑  收藏  举报