作者 yangfu

readme

正在显示 1 个修改的文件 包含 148 行增加0 行删除
  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 +1. 入参跟返回值都要定义一个协议结构 protocol.XxxRequest *protocol.XxxResponse,方便扩展
  96 +2. 函数方法的变量都定义在函数的头几行 var( ... )
  97 +3. 服务调用尽量封装成接口,方便测试扩展 比如:ISmsServe{ Send() error }
  98 +4. 公用的基础代码库,需要做一下封装放在 [gocomm](http://gitlab.fjmaimaimai.com/mmm-go/gocomm) ,方便在其他项目中调用
  99 +4. 可以使用代码生成固定格式, [项目地址](http://gitlab.fjmaimaimai.com/mmm-go/gencode)
  100 +脚本:
  101 +.\gencode.exe new -c Auth -m Login
  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 +