被无视的小细节

简介: 被无视的小细节

最近要写一个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的赋值操作,故而还是初始化时的值.



目录
相关文章
|
9月前
|
存储 安全 编译器
C++学习过程中的一些值得注意的小点(1)
C++学习过程中的一些值得注意的小点(1)
|
存储 监控 小程序
《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户体系系统,对接过许多开放平台,也搞过消息中心这类较为复杂的应用,但幸运的是,我至今还没有遇到过线上系统由于代码崩溃导致资损的情况。这其中的原因有三点:一是业务系统本身并不复杂;二是我一直遵循某大厂代码规约,在开发过程中尽可能按规约编写代码;三是经过多年的开发经验积累,我成为了一名熟练工,掌握了一些实用的技巧。
116 0
《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹
|
程序员
相见恨晚的Matlab编程小技巧(2)-代码怎么做到逻辑清晰?——巧用注释符“%“
        本文将以教程的形式详细介绍Matlab中两个常用符号“%”和“%%”的作用。初学者可以通过此文掌握这两个符号的用法,为Matlab编程打下坚实的基础。
关于《生成器运行时机导致的难以察觉的 bug》勘误
关于《生成器运行时机导致的难以察觉的 bug》勘误
90 0
|
Python
上古代码漫游记(二):把陷阱去掉了,反倒踩进了新的陷阱?
上古代码漫游记(二):把陷阱去掉了,反倒踩进了新的陷阱?
119 0
|
SQL 缓存 安全
如何避免写重复代码:善用抽象和组合
通过抽象和组合,我们可以编写出更加简洁、易于理解和稳定的代码;类似于金字塔的建筑过程,我们总是可以在一层抽象之上再叠加一层,从而达到自己的目标。但是在日常的开发工作中,我们如何进行实践呢?本文将以笔者在Akka项目中的一段社区贡献作为引子分享笔者的一点心得。
167 0
如何避免写重复代码:善用抽象和组合
|
Unix Apache C++
给代码写注释时有哪些讲究?
给代码写注释时有哪些讲究?
183 0
给代码写注释时有哪些讲究?
|
设计模式 消息中间件 JavaScript
代码越写越乱?那是因为你没用责任链
代码越写越乱?那是因为你没用责任链
代码越写越乱?那是因为你没用责任链
|
设计模式
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(1)
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(1)
175 0
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(1)
|
设计模式 安全 Java
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(2)
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(2)
157 0
别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!(2)