lua-coding-style | CloudKey Ocean
<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>
  • 文件名: 首字母大写驼峰型(第一个单词首字母也大写)
  • 常量: 由字母、数字、 构成,字母全大写,首字母必须为字母,单词之间使用”“相连
  • 函数名: 由字母、数字、 构成,字母全小写,首字母必须为字母,单词之间使用”“相连
  • 局部变量:由字母、数字、 构成,字母全小写,首字母必须为字母,单词之间使用”“相连
  • 全局变量:由字母、数字、 构成,字母全小写,必须为”g“开头,单词之间使用”_”相连,最好不用全局变量
  • 配置变量:由字母、数字、 构成,由”Conf“开头,单词首字母大写,单词之间使用”_”相连
  • 代码组织:

    • 文件开头加上功能描述;每个文件都加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中全局变量使用如果不当会导致一些未可知的异常情况。

      类似的也有其他同学遇到过相似的困扰:

      1
      2
      3
      https://github.com/openresty/lua-nginx-module/issues/150
      http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker
      http://zacharyhu.org/?p=373

      解决方案:
      在用 ngx-releng 脚本check代码全量global变量之后,将所有global更改为local;同时对长连接建立失败或者读写超时的连接,进行close connection的处理。经验证上线之后数据错乱问题不再复现。

    • 所以建议对自己的代码用ngx-releng脚本进行check,尽量使用local变量。
      <div class="fexo-comments comments-post">