首页 > 其他分享 >安全编码案例(52)go结构体方法未使用指针,结构体实例的锁失效

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

时间:2023-03-11 19:33:06浏览次数:38  
标签: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、建议使用指针,在结构体的成员方法中允许修改该结构体的成员变量是合理的。且如果结构体足够大,使用指针可以加快效率。

标签:52,实例,使用,go,失效,指针,方法,结构
From: https://www.cnblogs.com/gongxianjin/p/17206774.html

相关文章

  • OpenCv Mat 数据结构
    前言OpenCv的Mat数据结构可以存储图片信息。但是以坐标系构建来说,Mat是以左上角为原点,而我们自己的日常习惯是以左下角为原点。本文提供了这两者之间的一种转换。假设M......
  • ubuntu 彻底卸载一款软件的常用步骤(以 google chrome 为例)
    如果你想从Ubuntu中彻底卸载Google浏览器,你可以用命令行的方式来操作:sudoapt-getpurgegoogle-chrome-stable,这个命令会删除Chrome浏览器的软件包和配置文件。sudoap......
  • 计算机体系结构绪论
    1.什么是计算机体系结构“计算机体系结构”是由G.M.Amdahl等人于1964年提出的,当时意指程序员看到的计算机属性,即程序员为编写出可以在计算机上正确运行的程......
  • 结构伪类选择器 (部分)
    <doctypehtml><html><head>  <metacharset="utf-8">  <title>study</title>  <linkrel="stylesheet"href="study.css"type="text/css">  <sty......
  • uniapp+django 新手学习步骤记录
    1.Django项目和uni-app项目的创建及项目文件讲解_慕容星言的博客-CSDN博客 注意同时安装了python2和python3,pip记得用pip3用pythonmanage.pystartappuniappclient创......
  • 数据结构学习笔记-day2
    Day2一、算法和算法分析算法特性:有穷性、确定性、可行性、输入、输出。2.算法的时间复杂度:(影响算法时间代价的最主要因素是问题规模)               ......
  • Django
    Django简介:https://code.ziqiangxuetang.com/django/django-basic.htmlDjango安装教程:http://www.runoob.com/django/django-tutorial.html--------------------------......
  • celery执行异步任务 延迟任务 定时任务 Django中使用celery 双写一致性
    目录回顾补充只做定时任务的简单框架celery执行异步任务、延迟任务、定时任务定时任务:使用步骤:注意点:Django中使用celery使用步骤:秒杀功能:秒杀逻辑分析:django中使用celery......
  • 用Maui META 3G找不到NVRAM_EF_SML_LID数据结构
    用MauiMETA3G查看锁网信息时,找不到NVRAM_EF_SML_LID的数据结构请在 nvram_editor_data_item.h 中找到以下部分:#ifdefined(__NVRAM_SML_IN_DB__)LID_BITVER_L......
  • go学习 day207 继承
    编写一个学生考试系统packagemainimport( "fmt")//编写一个学生考试系统typestudentstruct{ Namestring Ageint Scoreint}//将Pupil和Graduate......