• 【go语言学习】编程规范


    学习一门语言,首先要了解该语言的代码编程规范,以提高代码的可读性、规范性。

    一、 命名规范

    同其他编程语言一样,go 语言命名可以由字母、数字和下划线组成,并且不能以数字开头。go 语言命名区分大小写。

    当命名以大写字母开头时,可以被外部包的代码使用,以小写字母开头,则对外部包不可见。
    

    两个等级:【shall】必须 【should】建议。

    1、包命名:package

    【shall】包名必须全部小写,无下划线,简短,见名知义。尽量不要与标准库重名,禁止通过中划线连接多个单词。
    【should】尽量和目录名保持一致。

    package main
    
    package student
    
    2、 文件命名

    【shall】文件名使用小写单词,可以使用下划线分割各个单词,但是头尾不能为下划线。
    【should】文件名虽然允许出现下划线,但是尽量避免。文件名尽量简短,见名知义。

    my_utils.go
    
    3、变量命名

    【shall】变量命名采用大小写驼峰法命名,不允许使用下划线。

    • 特有名词开头在私有的情况下,使用小写,如urlArray
    • 特有名词开头在公开的情况下,使用小写,如URLArray
    • 若变量类型为 bool,则命名应以HasIsCanAllow开头,如isExit
    4、常量命名

    【should】常量&枚举名,大小写驼峰法,不允许下划线,第三方包例外。

    const AppEnv = "1.0"
    
    5、 结构体命名

    【shall】结构体名必须为大小写混排的驼峰模式,不允许出现下划线,首字母根据访问控制大写或者小写
    【should】结构名建议采用名词、动名词,struct 申明和初始化格式采用多行,例如下面:

    // 多行申明
    type User struct{
        Username  string
        Email     string
    }
    
    // 多行初始化
    u := User{
        Username: "astaxie",
        Email:    "astaxie@gmail.com",
    }
    
    
    6、 接口命名

    【shall】接口名必须为大小写混排的驼峰模式,不允许出现下划线,首字母根据访问控制大写或者小写,整体必须为名词。
    【should】单个函数的结构名以 “er” 作为后缀,例如 Reader , Writer 。

    type Reader interface {
            Read(p []byte) (n int, err error)
    }
    
    
    7、函数&方法名

    【shall】函数名必须为大小写混排的驼峰模式,首字母根据访问控制大写或者小写。
    【should】函数名力求精简准确,并采用动词或动词短语。

    func MakeRegexpArrayOrDie(){}     // 包外可访问
    
    func matchesRegexp(){}            // 包内访问
    

    【shall】方法接收者命名必须为大小写混排,首字母小写。方法接收者命名要能够体现接收者对象。
    【should】方法接收者命名通常1个或者2个字母就够,最长不能超过4个字母。
    【should】方法接收者命名不要使用 me,this 或者 self 这种泛指的名字。

    func (c *Controller) Run(){}
    
    8、 参数和返回值命名

    【should】参数名和返回值命名必须为大小写混排的驼峰模式,且首字母小写,不能有下划线。

    func getAge(studentName string)(age int){}
    

    二、注释规范

    Go 提供 C 风格的/* */块注释和 C++ 风格的//行注释。行注释更加通用;块注释主要用于针对包的详细说明或者屏蔽大块的代码。

    1、包注释
    • 每个包都应该有一个包注释,一个位于 package 子句之前的块注释或行注释。
    • 包注释应该包含下面基本信息(简介,创建人,创建时间)

    例如 util 包的注释示例如下

    // util 包, 这是一个公共函数的工具包
    // 创建人: 姑姑
    // 创建时间: 20200816
    
    2、结构&接口注释

    每个自定义的结构体或者接口都应该有注释说明,该注释对结构进行简要介绍,放在结构体定义的前一行,格式为: 结构体名, 结构体说明。同时结构体内的每个成员变量都要有说明,该说明放在成员变量的后面(注意对齐),实例如下:

    // User , 用户对象,定义了用户的基础信息
    type User struct{
        Username  string // 用户名
        Email     string // 邮箱
    }
    
    3、函数(方法)注释

    每个函数或者方法都应该有注释说明,函数的注释应该包括三个方面(严格按照此顺序撰写):

    • 简要说明,格式说明:以函数名开头,“,”分隔说明部分
    • 参数列表:每行一个参数,参数名开头,“,”分隔说明部分
    • 返回值: 每行一个返回值

    示例如下:

    // NewtAttrModel , 属性数据层操作类的工厂方法
    // 参数:
    //      ctx ,上下文信息
    // 返回值:
    //      属性操作类指针
    func NewAttrModel(ctx *common.Context) *AttrModel {
    }
    
    4、代码逻辑注释

    对于一些关键位置的代码逻辑,或者局部较为复杂的逻辑,需要有相应的逻辑说明,方便其他开发者阅读该段代码,实例如下:

    // 从 Redis 中批量读取属性,对于没有读取到的 id ,
    // 记录到一个数组里面,准备从 DB 中读取
    xxxxx
    xxxxxxx
    xxxxxxx
    
    5、注释风格

    统一使用中文注释,对于中英文字符之间严格使用空格分隔, 这个不仅仅是中文和英文之间,英文和中文标点之间也都要使用空格分隔,例如:

    // 从 Redis 中批量读取属性,对于没有读取到的 id , 
    // 记录到一个数组里面,准备从 DB 中读取
    

    上面 Redis 、 id 、 DB 和其他中文字符之间都是用了空格分隔。

    • 建议全部使用单行注释
    • 和代码的规范一样,单行注释不要过长,禁止超过 120 字符。

    三、代码风格

    1、缩进和折行
    • 缩进直接使用 gofmt 工具格式化即可(gofmt 是使用 tab 缩进的);
    • 折行方面,一行最长不超过120个字符,超过的请使用换行展示,尽量保持格式优雅。
    2、语句的结尾

    Go语言中是不需要类似于Java需要冒号结尾,默认一行就是一条数据

    如果你打算将多个语句写在同一行,它们则必须使用 ;

    3、括号和空格

    括号和空格方面,也可以直接使用 gofmt 工具格式化(go 会强制左大括号不换行,换行会报语法错误),所有的运算符和操作数之间要留空格。

    // 正确的方式
    if a > 0 {
    
    } 
    
    // 错误的方式
    if a>0  // a ,0 和 > 之间应该空格
    {       // 左大括号不可以换行,会报语法错误
    
    }
    
    
    4、import 规范

    import在多行的情况下,goimports会自动帮你格式化,但是我们这里还是规范一下import的一些规范,如果你在一个文件里面引入了一个package,还是建议采用如下格式:

    import (
        "fmt"
    )
    

    如果你的包引入了三种类型的包,标准库包,程序内部包,第三方包,建议采用如下方式进行组织你的包:

    import (
        "encoding/json"
        "strings"
    
        "myproject/models"
        "myproject/controller"
        "myproject/utils"
    
        "github.com/astaxie/beego"
        "github.com/go-sql-driver/mysql"
    )   
    

    有顺序的引入包,不同的类型采用空格分离,第一种实标准库,第二是项目包,第三是第三方包。

    在项目中不要使用相对路径引入包:

    // 这是不好的导入
    import “../net”
    
    // 这是正确的做法
    import “github.com/repo/proj/src/net”
    

    但是如果是引入本项目中的其他包,最好使用相对路径。

    5、错误处理
    • 错误处理的原则就是不能丢弃任何有返回err的调用,不要使用 _ 丢弃,必须全部处理。接收到错误,要么返回err,或者使用log记录下来
    • 尽早return:一旦有错误发生,马上返回
    • 尽量不要使用panic,除非你知道你在做什么
    • 错误描述如果是英文必须为小写,不需要标点结尾
    • 采用独立的错误流进行处理
    // 错误写法
    if err != nil {
        // error handling
    } else {
        // normal code
    }
    
    // 正确写法
    if err != nil {
        // error handling
        return // or continue, etc.
    }
    // normal code
    
    
    6、测试

    单元测试文件名命名规范为 example_test.go
    测试用例的函数名称必须以 Test 开头,例如:TestExample
    每个重要的函数都要首先编写测试用例,测试用例和正规代码一起提交方便进行回归测试

  • 相关阅读:
    novell.directory.ldap获取邮箱活动目录
    xamarin.android 资源图片问题
    xamarin.android 消息推送功能--极光推送
    xamarin.IOS App闪退日志----crash
    xamarin android 获取根证书代码
    xamarin.android pullToRefresharp.Android下拉刷新样式、侧滑删除功能
    数字证书链验证
    xamarin DependencyService源码阅读
    xamarin android ListView手动分组
    xamarin android,UWP 网络类型和IP地址
  • 原文地址:https://www.cnblogs.com/everydawn/p/13854257.html
Copyright © 2020-2023  润新知