lua
<meta name="keywords" content="lua,"/>
<link rel="icon" href="/favicon.ico"/>
<link rel="stylesheet" href="/css/personal-style.css"/>
<script async="" src="https://busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<span id="toolbox-mobile" class="toolbox-mobile">盒子</span>
<li class="item-toolbox">
<a class="ROUND_RECT" href="/archives/" rel="noopener noreferrer" target="_self">
博客
</a>
</li>
<li class="item-toolbox">
<a class="ROUND_RECT" href="/category/" rel="noopener noreferrer" target="_self">
分类
</a>
</li>
<li class="item-toolbox">
<a class="ROUND_RECT" href="/tag/" rel="noopener noreferrer" target="_self">
标签
</a>
</li>
<li class="item-toolbox">
<a class="ROUND_RECT" href="/link/" rel="noopener noreferrer" target="_self">
友链
</a>
</li>
<li class="item-toolbox">
<a class="ROUND_RECT" href="/about/" rel="noopener noreferrer" target="_self">
关于
</a>
</li>
<li class="item-toolbox">
<a class="ROUND_RECT" href="/atom.xml" rel="noopener noreferrer" target="_blank">
RSS
</a>
</li>
<li class="item-toolbox">
<a class="ROUND_RECT" href="/search/" rel="noopener noreferrer" target="_self">
搜索
</a>
</li>
</ul>
<h2 id="命名规范:"><a href="#命名规范:" class="headerlink" title="命名规范:"></a>命名规范:</h2><ul>
代码组织:
文件开头加上功能描述;每个文件都加module限定词;导入的模块都加local限定词
所有函数都加注释:
函数功能: @brief xxx
param描述:@param xxx
return: @return xxx合理的空行:函数之间、函数内部代码块之间
注释格式:单行注释使用”–”;多行注释使用–[[]],其中在”]]”前面加”–”,如果要取消注释,只用在”–[[“前再加一个”-“就行
常量、消息号、枚举值行末都加上分号 ——?
函数内的临时变量、文件内的局部函数都加上 local 限定词
函数内部代码块尽量加注释
单个函数较长时(大于100行),尽量拆分成多个子函数
assert 函数开销不小,请慎用
lua类设计时,用元表来实现oop
不要直接增加函数成员,因为直接增加函数成员会导致内存增加,并且在jit下执行效率和用元表方式无差异
空格符:
运算符之间,如 s = a + b
参数列表或数组元素之间,如 fuction my_sum(a, b),{1, 2, 3}
注意:函数参数列表中,左括号与第一个参数之间、右括号与最后一个参数之间,都不要加空格单行超过80字符时,应该换行
函数参数换行时,下一行与上一行的第一个参数对齐
运算较复杂时,使用小括号分割每个运算逻辑,增加可读性,同时避免运算符优先级顺序问题
4字符缩进
日志:
1.明确的日志级别
2.每个异常处必须有日志(warning、error)说明异常原因
3.日志必须传一个参数,可以是string和table,如果是string,最好为[key:value]形式;如果是table,日志库会自动转成[key:value]形式,且第一个key为message(如果存在)尽量减少表中的成员是另一个表的引用 ——?
取table的长度用#,不用table.getn
当table中的key是纯数字(不一定有序)的时候,求table长度不可以用#(错误),可以用Utils.tableCount(pairs遍历)函数;
相同场景,打印table的内容,用Utils.simple_var_dump(table.concat实现);
按照key大小顺序遍历的话,用pairsByKeys(this function get from [Programming In Lua])获取迭代器尽量避免magic number
lua的全局变量问题
之前使用ngx-lua实现一个类似proxy的项目时,发现使用长连接机制会导致 请求错乱(不同的连接数据发生混乱)的现象,经追查发现lua中全局变量使用如果不当会导致一些未可知的异常情况。
类似的也有其他同学遇到过相似的困扰:
123https://github.com/openresty/lua-nginx-module/issues/150http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Workerhttp://zacharyhu.org/?p=373解决方案:
在用 ngx-releng 脚本check代码全量global变量之后,将所有global更改为local;同时对长连接建立失败或者读写超时的连接,进行close connection的处理。经验证上线之后数据错乱问题不再复现。- 所以建议对自己的代码用ngx-releng脚本进行check,尽量使用local变量。
<div class="fexo-comments comments-post">