作者 唐旭辉
  1 +## 目录
  2 +* [代码声明](#代码声明)
  3 + * [命名规范](#命名规范)
  4 + * [项目约定](#项目约定)
  5 + * [注意事项](#注意事项)
  6 +
  7 +### 代码声明
  8 +
  9 +#### 命名规范
  10 +
  11 +1.包名
  12 +
  13 +```
  14 +*
  15 +package名和目录保持一致,需避免和标准库冲突
  16 +小写
  17 +*
  18 +package comm
  19 +```
  20 +
  21 +2.命名
  22 +
  23 +```
  24 +package pkg
  25 +
  26 +*1.错误*
  27 +/*
  28 +定义在包的首部,所有错误都定义在一起,
  29 +并且以Err开头
  30 +*/
  31 +var ErrFooBar = fmt.Errorf("pkg: ...")
  32 +
  33 +*2.变量*
  34 +/*
  35 +采用驼峰命名
  36 +*/
  37 +var fooBar int
  38 +
  39 +*3.常量*
  40 +/*
  41 +大写+下划线
  42 +*/
  43 +var(
  44 + FOO = 1
  45 + BAR = 2
  46 + FOO_BAR = 3
  47 +)
  48 +
  49 +*4.结构*
  50 +/*
  51 +采用驼峰命名法
  52 +*/
  53 +type FooBar struct{
  54 + foo int
  55 + Bar string
  56 +}
  57 +
  58 +
  59 +*5.方法接口*
  60 +/*
  61 +采用驼峰命名法
  62 +非对外方法,首字母需为小写
  63 +*/
  64 +func foo(){}
  65 +func Foo(){}
  66 +```
  67 +
  68 +3.目录结构
  69 +```
  70 +* conf //配置
  71 + * dev.conf
  72 + * prod.conf
  73 +* controller //控制器
  74 + * v1
  75 + * auth.go
  76 +* internal
  77 + * repository //存储层
  78 + * user.go
  79 + * *_mock.go
  80 +* model //模型
  81 +* protocol //协议层
  82 +* routers //路由
  83 +* service //逻辑层
  84 + * auth
  85 +* static //静态数据
  86 +* views //视图
  87 +
  88 +* main.go
  89 +* Dockerfile
  90 +* README.md
  91 +* *.sh //脚本
  92 +```
  93 +
  94 +#### 项目约定
  95 +
  96 +1. 入参跟返回值都要定义一个协议结构 protocol.XxxRequest *protocol.XxxResponse,方便扩展
  97 +2. 函数方法的变量都定义在函数的头几行 var( ... )
  98 +3. 服务调用尽量封装成接口,方便测试扩展 比如:ISmsServe{ Send() error }
  99 +4. 公用的基础代码库,需要做一下封装放在 [gocomm](http://gitlab.fjmaimaimai.com/mmm-go/gocomm) ,方便在其他项目中调用
  100 +4. 可以使用代码生成固定格式, [项目地址](http://gitlab.fjmaimaimai.com/mmm-go/gencode) 脚本:.\gencode.exe new -c Auth -m Login
  101 +
  102 +```
  103 +package pkg
  104 +//Login
  105 +func(this *AuthController)Login(){
  106 + var msg *mybeego.Message
  107 + defer func(){
  108 + this.Resp(msg)
  109 + }()
  110 + var request *protocol.LoginRequest
  111 + if err:=json.Unmarshal(this.ByteBody,&request);err!=nil{
  112 + log.Error(err)
  113 + msg = mybeego.NewMessage(1)
  114 + return
  115 + }
  116 + if b,m :=this.Valid(request);!b{
  117 + msg = m
  118 + return
  119 + }
  120 + msg = this.GenMessage(auth.Login(request))
  121 +}
  122 +
  123 +/*Login */
  124 +type LoginRequest struct {
  125 + Xxx string`json:"xxx" valid:"Required"`
  126 +}
  127 +type LoginResponse struct {
  128 +}
  129 +
  130 +func Login(request *protocol.LoginRequest)(rsp *protocol.LoginResponse,err error){
  131 + var (
  132 +
  133 + )
  134 + rsp =&protocol.LoginResponse{}
  135 + return
  136 +}
  137 +```
  138 +
  139 +
  140 +#### 注意事项
  141 +
  142 +1. 启动一个groutine(eg:go func(){}()),需要在函数内进行recover,不然groutine里面panic,会导致外部程序一起崩溃掉;
  143 +2. 当接受者是map, chan, func, 不要使用指针传递,因为它们本身就是引用类型
  144 +3. 当接受者类型是一个结构体并且很庞大,或者是一个大数组,建议使用指针传递来提高性能,其他场景使用值传递即可
  145 +4. 当接受者是一个结构体,并且包含了sync.Mutex或者类似的用于同步的成员。必须使用指针传递,避免成员拷贝
  146 +5. 当函数内部需要修改接受者,必须使用指针传递
  147 +6. 声明空的slice应该使用下面的格式: var t []string 不要使用 t := []string{} ,前者声明了一个nil slice而后者是一个长度为0的非nil的slice。
  148 +
  1 +#!/bin/bash
  2 +
  3 +pwd=`pwd`
  4 +target=`basename $pwd`
  5 +
  6 +# Kill running program
  7 +pid=`ps -C ${target} -o pid=`
  8 +if [ -n "$pid" ]; then
  9 +
  10 + echo "Stopping old version, PID: ${pid}"
  11 + if [ "$1" = "-f" ]; then
  12 + # force shutdown
  13 + echo "Force shutdown..."
  14 + kill $(ps -C ${target} -o pid=)
  15 + else
  16 + kill -s 2 $(ps -C ${target} -o pid=)
  17 + fi
  18 +
  19 + # wait for program to stop
  20 + pid=`ps -C ${target} -o pid=`
  21 + while [ -n "$pid" ]; do
  22 + sleep 1
  23 + done
  24 +fi
  25 +
  26 +# Rollback
  27 +if [ -f "${target}-backup" ]; then
  28 + echo "Rolling back..."
  29 + if [ -f "${target}" ]; then
  30 + rm "${target}"
  31 + fi
  32 + mv ${target}-backup ${target}
  33 + echo "Rollback Complete"
  34 +fi
  35 +
  36 +# run
  37 +echo "Starting..."
  38 +./run.sh ${target}
  39 +echo "Done"
  1 +#!/bin/bash
  2 +
  3 +echo "begin run $1"
  4 +# 以后台方式启动程序,并且将日志记录到 app.log
  5 +./$1 >> tmp.log 2>&1 &
  6 +pid=`ps -C $1 -o pid=`
  7 +
  8 +if [ -n "$pid" ]; then
  9 + echo "success"
  10 +else
  11 + echo "fail"
  12 +fi
  1 +#!/bin/bash
  2 +
  3 +pwd=`pwd`
  4 +target=`basename $pwd`
  5 +# kill
  6 +pid=`ps -C ${target} -o pid=`
  7 +if [ -n "$pid" ]; then
  8 + echo "Stopping old version, PID: ${pid}"
  9 + if [ "$1" = "-f" ]; then
  10 + # force shutdown
  11 + echo "Force shutdown..."
  12 + kill -9 $(ps -C ${target} -o pid=)
  13 + else
  14 + kill -9 $(ps -C ${target} -o pid=)
  15 + fi
  16 + # wait for program to stop
  17 + pid=`ps -C ${target} -o pid=`
  18 + while [ -n "$pid" ]; do
  19 + sleep 1
  20 + done
  21 +fi
  22 +
  23 +# upgrade
  24 +if [ -f "${target}-new" ]; then
  25 + echo "Upgrading..."
  26 + if [ -f "${target}-backup" ]; then
  27 + backupdt=`date +%Y%m%d-%H`
  28 + mv "${target}-backup" "${target}-backup-${backupdt}"
  29 + fi
  30 +
  31 + mv ${target} ${target}-backup
  32 + mv ${target}-new ${target}
  33 +
  34 + echo "Upgrade Complete"
  35 +fi
  36 +
  37 +# run
  38 +echo "Starting..."
  39 +./run.sh ${target}
  40 +echo "Done"
  1 +#!/bin/bash
  2 +
  3 +pwd=`pwd`
  4 +target=`basename $pwd`
  5 +
  6 +# kill
  7 +pid=`ps -C ${target} -o pid=`
  8 +if [ -n "$pid" ]; then
  9 +
  10 + echo "Stopping old version, PID: ${pid}"
  11 + if [ "$1" = "-f" ]; then
  12 + # force shutdown
  13 + echo "Force shutdown..."
  14 + kill -9 $(ps -C ${target} -o pid=)
  15 + else
  16 + kill -9 $(ps -C ${target} -o pid=)
  17 + fi
  18 +
  19 + # wait for program to stop
  20 + pid=`ps -C ${target} -o pid=`
  21 + while [ -n "$pid" ]; do
  22 + sleep 1
  23 + done
  24 +
  25 +fi
  26 +
  27 +echo "Done"