被无视的小细节

简介: 被无视的小细节

最近要写一个web服务,对外提供几个Api,选用gin框架.

gin的路由广泛为人好评,一直是”gin为什么这么快”的主角. 正在看其用到的httprouter的源码, 对这种特殊的trie树---基树树(Radix Tree),也有还不错的理解.

(

httprouter包只有200多k,非常值得一看

)

就在自以为洞若观火 高屋建瓴,写几个接口如是小菜一碟时,一个诡异的获取数据库资源句柄的问题扰了我许久,最后解开疑惑,哑然失笑.


这是随便一搜,从某处复制的代码, 我用的是pg, 这里是mysql,于是调试, 顺手把代码做了下面这样看似更”简洁”的改动


initDatabase方法里调试,可以正常连接pg,获取到数据.

为使项目层次更清晰,使以后接口数量增多而不致混乱,对项目进行了常规的分层.

在model这个package里,如下图 调用刚才的pg连接句柄,发现每次拿到的都是nil


而再回initDatabase方法调试,没问题,可以获取到数据

这就让我感到疑惑…

不得已重新梳理了一下复制的那段代码的逻辑,发现忽略了一个细小知识点----

全局变量,局部变量

变量的作用范围

:

上述代码中,全局变量会在init()方法执行前被执行,而后执行init()及其调用到的子方法.

当在其他地方调用到这个package里的函数时(此处为GetEngine),上述两步一定会先执行,完成后才到调用到的函数

看下面这个demo,就一目了然


output:

1234
姓名:CUISHUANG年龄:27手机号:17666666666薪资:30000

可长点记性吧! 看,薪资一下少了5万

具体到遇到的问题,当在model中调用该方法以期返回资源时, 先初始化全局变量(或者说赋值,虽然很多情况下是赋零值),而后执行init(),然后到子方法initDatabase,

先前的写法,

1
DB, err = xorm.NewEngine("postgres", addr)

是在修改全局变量DB,或者说,在initDatabase里操作的,和在外面定义是同一块内存.

而自以为”简约”地改为如下之后,

相当于在一个方法里,重新定一个一个同名的局部变量,这个局部变量DB指向的内存,与外面的全局变量DB并不相同.

而最后调用GetEngine方法,返回的DB,还是最开始定义的那个全局变量,其并未经过initDatabase的赋值操作,故而还是初始化时的值.



目录
相关文章
|
存储 Linux Shell
深度剖析 Linux cp 命令的秘密
用 cp 拷贝了一个 100 GiB 的文件,竟然一秒不到就拷贝完成了。一个 SATA 机械盘的写能力能到 150 MiB/s (大部分的机械盘都是到不了这个值的)就算非常不错了,所以,正常情况下,copy 一个 100G 的文件至少要 682 秒 ( 100 GiB/ 150 MiB/s ),也就是 11 分钟。
1400 0
|
算法 Python
关联规则算法及其画图(python
关联规则算法及其画图(python
163 2
|
JSON IDE 前端开发
[.NET开发者的福音]一个方便易用的在线.NET代码编辑工具.NET Fiddle
[.NET开发者的福音]一个方便易用的在线.NET代码编辑工具.NET Fiddle
147 0
|
11月前
|
Linux Python
Linux 安装python3.7.6
本教程介绍在Linux系统上安装Python 3.7.6的步骤。首先使用`yum`安装依赖环境,包括zlib、openssl等开发库。接着通过`wget`下载Python 3.7.6源码包并解压。创建目标文件夹`/usr/local/python3`后,进入解压目录执行配置、编译和安装命令。最后设置软链接,使`python3`和`pip3`命令生效。
|
9月前
|
知识图谱
RT-DETR改进策略【Conv和Transformer】| 2023 引入CloFormer中的Clo block 双分支结构,融合高频低频信息(二次创新AIFI)
RT-DETR改进策略【Conv和Transformer】| 2023 引入CloFormer中的Clo block 双分支结构,融合高频低频信息(二次创新AIFI)
286 12
RT-DETR改进策略【Conv和Transformer】| 2023 引入CloFormer中的Clo block 双分支结构,融合高频低频信息(二次创新AIFI)
|
存储 人工智能 安全
智能语音助手的隐私保护技术探讨####
【10月更文挑战第19天】 本文聚焦于智能语音助手的隐私保护技术,通过分析当前技术现状、面临的挑战及未来发展趋势,为开发者和用户提供了一份深入浅出的技术指南。文章指出,随着人工智能技术的飞速发展,智能语音助手已成为日常生活的重要组成部分,但其背后的隐私问题不容忽视。通过技术创新和合理的策略部署,我们有望在享受便捷服务的同时,有效保护个人隐私。 ####
|
JavaScript 前端开发 C++
58Vue - Props(字面量语法 vs 动态语法)
58Vue - Props(字面量语法 vs 动态语法)
82 0
|
小程序 JavaScript Java
记账本|基于SSM的家庭记账本小程序设计与实现(源码+数据库+文档)
记账本|基于SSM的家庭记账本小程序设计与实现(源码+数据库+文档)
308 0
|
移动开发 JavaScript 前端开发
HTML ,XHTML,HTML5简介,js,JSP与Servlet的关系理解
HTML ,XHTML,HTML5简介,js,JSP与Servlet的关系理解
|
存储 SQL 关系型数据库
MySQL事务管理(三)
MySQL事务管理
193 0

热门文章

最新文章