简介: gofmt 大部分的格式问题可以通过gofmt解决,gofmt自动格式化代码,保证所有的go代码与官方推荐的格式保持一致,于是所有格式有关问题,都以gofmt的结果为准。

  • gofmt

大部分的格式问题可以通过gofmt解决,gofmt自动格式化代码,保证所有的go代码与官方推荐的格式保持一致,于是所有格式有关问题,都以gofmt的结果为准。

  • 行长

一行最长不超过80个字符,超过的使用换行展示,尽量保持格式优雅。

  • 注释

在编码阶段应该同步写好变量、函数、包的注释,最后可以利用godoc导出文档。注释必须是完整的句子,句子的结尾应该用句号作为结尾(英文句号)。注释推荐用英文,可以在写代码过程中锻炼英文的阅读和书写能力。而且用英文不会出现各种编码的问题。
每个包都应该有一个包注释,一个位于package子句之前的块注释或行注释。包如果有多个go文件,只需要出现在一个go文件中即可。

// ping包实现了常用的ping相关的函数
package ping

导出函数注释,第一条语句应该为一条概括语句,并且使用被声明的名字作为开头。

// 求a和b的和,返回sum。
func Myfunction(sum int) (a, b int) {
  • 命名

    • 需要注释来补充的命名就不算是好命名。
    • 使用可搜索的名称:单字母名称和数字常量很难从一大堆文字中搜索出来。单字母名称仅适用于短方法中的本地变量,名称长短应与其作用域相对应。若变量或常量可能在代码中多处使用,则应赋其以便于搜索的名称。
    • 做有意义的区分:Product和ProductInfo和ProductData没有区别,NameString和Name没有区别,要区分名称,就要以读者能鉴别不同之处的方式来区分 。
    • 函数命名规则:驼峰式命名,名字可以长但是得把功能,必要的参数描述清楚,函数名名应当是动词或动词短语,如postPayment、deletePage、save。并依Javabean标准加上get、set、is前缀。例如:xxx + With + 需要的参数名 + And + 需要的参数名 + .....
    • 结构体命名规则:结构体名应该是名词或名词短语,如Custome、WikiPage、Account、AddressParser,避免使用Manager、Processor、Data、Info、这样的类名,类名不应当是动词。
    • 包名命名规则:包名应该为小写单词,不要使用下划线或者混合大小写。
    • 接口命名规则:单个函数的接口名以"er"作为后缀,如Reader,Writer。接口的实现则去掉“er”。
type Reader interface {Read(p []byte) (n int, err error)
}

两个函数的接口名综合两个函数名

type WriteFlusher interface {Write([]byte) (int, error)Flush() error
}

三个以上函数的接口名,抽象这个接口的功能,类似于结构体名

type Car interface {Start([]byte)Stop() errorRecover()
}
  • 常量

常量均需使用全部大写字母组成,并使用下划线分词:

const APP_VER = "1.0"

如果是枚举类型的常量,需要先创建相应类型:

type Scheme stringconst (HTTP  Scheme = "http"HTTPS Scheme = "https"
)

如果模块的功能较为复杂、常量名称容易混淆的情况下,为了更好地区分枚举类型,可以使用完整的前缀:

type PullRequestStatus intconst (PULL_REQUEST_STATUS_CONFLICT PullRequestStatus = iotaPULL_REQUEST_STATUS_CHECKINGPULL_REQUEST_STATUS_MERGEABLE
)
  • 变量

变量命名基本上遵循相应的英文表达或简写,在相对简单的环境(对象数量少、针对性强)中,可以将一些名称由完整单词简写为单个字母,例如:
* user 可以简写为 u
* userID 可以简写 uid
若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头:

var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool
  • 变量命名惯例

变量名称一般遵循驼峰法,但遇到特有名词时,需要遵循以下规则:

* 如果变量为私有,且特有名词为首个单词,则使用小写,如 apiClient
* 其它情况都应当使用该名词原有的写法,如 APIClient、repoID、UserID
* 错误示例:UrlArray,应该写成urlArray或者URLArray

下面列举了一些常见的特有名词:

// A GonicMapper that contains a list of common initialisms taken from golang/lint
var LintGonicMapper = GonicMapper{"API":   true,"ASCII": true,"CPU":   true,"CSS":   true,"DNS":   true,"EOF":   true,"GUID":  true,"HTML":  true,"HTTP":  true,"HTTPS": true,"ID":    true,"IP":    true,"JSON":  true,"LHS":   true,"QPS":   true,"RAM":   true,"RHS":   true,"RPC":   true,"SLA":   true,"SMTP":  true,"SSH":   true,"TLS":   true,"TTL":   true,"UI":    true,"UID":   true,"UUID":  true,"URI":   true,"URL":   true,"UTF8":  true,"VM":    true,"XML":   true,"XSRF":  true,"XSS":   true,
}
  • struct规范

struct申明和初始化格式采用多行:

定义如下:

type User struct{Username  stringEmail     string
}

初始化如下:

u := User{Username: "test",Email:    "test@gmail.com",
}
  • 控制结构

if
if接受初始化语句,约定如下方式建立局部变量

if err := file.Chmod(0664); err != nil {return err
}

for
采用短声明建立局部变量

sum := 0
for i := 0; i < 10; i++ {sum += i
}

return
尽早return:一旦有错误发生,马上返回

f, err := os.Open(name)
if err != nil {return err
}
d, err := f.Stat()
if err != nil {f.Close()return err
}
codeUsing(f, d)
  • 错误处理

    • error作为函数的值返回,必须对error进行处理
    • 错误描述如果是英文必须为小写,不需要标点结尾
    • 采用独立的错误流进行处理

不要采用下面的处理错误写法

    if err != nil {// error handling} else {// normal code}

采用下面的写法

    if err != nil {// error handlingreturn // or continue, etc.}// normal code

使用函数的返回值时,则采用下面的方式

x, err := f()
if err != nil {// error handlingreturn
}
// use x
  • panic

尽量不要使用panic,除非你知道你在做什么

  • import

对import的包进行分组管理,用换行符分割,而且标准库作为分组的第一组。如果你的包引入了三种类型的包,标准库包,程序内部包,第三方包,建议采用如下方式进行组织你的包

package mainimport ("fmt""os""kmg/a""kmg/b""code.google.com/a""github.com/b"
)

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

// 错误示例
import “../net”// 正确的做法
import “github.com/repo/proj/src/net”

goimports会自动帮你格式化

  • 参数传递

    • 对于少量数据,不要传递指针
    • 对于大量数据的struct可以考虑使用指针
    • 传入参数是map,slice,chan不要传递指针,因为map,slice,chan是引用类型,不需要传递指针的指针
  • 单元测试

单元测试文件名命名规范为 example_test.go
测试用例的函数名称必须以 Test 开头,例如:TestExample

Golang编码规范相关推荐

  1. 行之有效的Golang编码规范

    编码规范 熟悉编码规范可以帮助我们写出可读性高,可测试性高的代码 同时编码规范也是小型重构的利器,现在我们从命名,变量,循环,注释,函数等方面,谈谈如何从编码角度提升整体项目质量. 命名 命名的首要要 ...

  2. go 变量大写_28. 一文了解Go语言中编码规范

    大家好,我是明哥. 由于某些不可抗力,之前该专栏的所有内容都被删除了.因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒. 本文原文:http://golang.iswbm.com ...

  3. Go 语言编程 — 编码规范指南

    目录 文章目录 目录 参考 工程化要求 编码规范 大小约定 缩进.括号和空格约定 命名规范 包.目录命名规范 文件命名规范 标识符命名规范 变量.常量名 函数.方法名 结构体.接口名 空行.注释.文档 ...

  4. Go 学习笔记(83)— 编码规范及常用开发技巧

    UBER 开源的 Go 语言开发规范 1. 规范指南 1.1 包名 package 的命名应该遵循如下原则: 只由小写字母组成.不包含大写字母和下划线等字符: 简短并包含一定的上下文信息.例如 tim ...

  5. Google重磅发布Go语言编码规范

    前言 Google官方在2022.11.23重磅发布了Go语言编码规范. 这个编码规范源自于Google内部的Go项目,是Google的开发人员要遵守的代码规范. 在Go语言诞生后,全世界的Go开发者 ...

  6. 【转载】Uber Go语言编码规范

    文章目录 Uber Go语言编码规范 一. 介绍 二. 指导原则 指向interface的指针 接收器(receiver)与接口 零值Mutex是有效的 在边界处拷贝Slices和Maps 接收Sli ...

  7. Uber Go 语言编码规范

    Uber Go 语言编码规范 Uber 是一家美国硅谷的科技公司,也是 Go 语言的早期 adopter.其开源了很多 golang 项目,诸如被 Gopher 圈熟知的 zap.jaeger 等.2 ...

  8. JavaScript最全编码规范

    转载: JavaScript最全编码规范 类型 ●基本类型:访问基本类型时,应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo = ...

  9. 【C++】Google C++编码规范(三):智能指针

    [C++]Google C++编码规范(一):作用域 [C++]Google C++编码规范(二):类 std::unique_ptr std::unique_ptr是C++11标准里新推出的智能指针 ...

最新文章

  1. 在64位机上PLSQL连oracle11g问题:SQL*Net not properly installed和ORA-12154:TNS:无法处理服务名...
  2. 如何使用PHP发送电子邮件?
  3. myqltransactionRollbackexception deadlock found when trying to get lock
  4. C# 进程优先级和线程优先级的方法
  5. selenium+ant+testng测试框架简单介绍
  6. 将Linux加入Windows域
  7. mysql数据库操作宠物表_mysql数据库之表的操作
  8. stol函数在linux下使用,Linux下ATT汇编语法简介一
  9. PAT乙级(1019 数字黑洞)
  10. ubuntu12.04装机后设置
  11. uwsgi+django在ubuntu下命令部署亲测ok
  12. 带背景音乐的表白html,感人的表白背景音乐,适合浪漫表白的纯音乐
  13. Word VBA:MathType公式与Latex公式切换
  14. 接口测试简介以及接口测试用例设计思路
  15. Proxyee Down百度网盘高速下载器详细使用教程
  16. 【Hexo搭建个人博客】:yilia主题配置(四) - 分类管理
  17. OpenCV图像滤镜操作-模糊
  18. 苹果原壁纸高清_ios14.2壁纸原图高清分享:苹果ios14.2壁纸高清无水印[多图]
  19. 无边落木萧萧下,不尽长江滚滚来。
  20. 前端css让div浮动,Web前端篇:css浮动

热门文章

  1. php虚线_实现css虚线样式的两种方式:dotted和dashed(实例)
  2. matlab 2015 积分,Matlab中如何求解积分?
  3. PC端视频录制软件大集合,看看有没有你用过的?
  4. Kafka集群搭建过程(kafka2.5+eagle)
  5. WinMerge:一个免费开源的文件对比神器
  6. 关于微信小程序中的.eslintrc.js
  7. 夜思 | 听说你单身?“替代性恋爱”了解一下
  8. c++ 计算正弦的近似值_C语言中计算正弦的相关函数总结
  9. 系统异常SVC与PendSV指令及CM3 处理器内部寄存器分析
  10. MacBook 快捷键个人总结和设置