gofmt

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

注释

在编码阶段应该同步写好变量、函数、包的注释,最后可以利用 godoc 导出文档。注释必须是完整的句子,句子的结尾应该用句号作为结尾(英文句号)。注释推荐用英文,可以在写代码过程中锻炼英文的阅读和书写能力。而且用英文不会出现各种编码的问题。

每个包都应该有一个包注释,一个位于 package 子句之前的块注释或行注释。包如果有多个 go 文件,只需要出现在一个 go 文件中即可。

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

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

  1. // Myfunction 求 a 和 b 的和,返回 sum。
  2. 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”。
  1. type Reader interface {
  2. Read(p []byte) (n int, err error)
  3. }

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

  1. type WriteFlusher interface {
  2. Write([]byte) (int, error)
  3. Flush() error
  4. }

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

  1. type Car interface {
  2. Start([]byte)
  3. Stop() error
  4. Recover()
  5. }

常量

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

  1. const APP_VER = "1.0"

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

  1. type Scheme string
  2.  
  3. const (
  4. HTTP Scheme = "http"
  5. HTTPS Scheme = "https"
  6. )

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

  1. type PullRequestStatus int
  2.  
  3. const (
  4. PULL_REQUEST_STATUS_CONFLICT PullRequestStatus = iota
  5. PULL_REQUEST_STATUS_CHECKING
  6. PULL_REQUEST_STATUS_MERGEABLE
  7. )

变量

变量命名基本上遵循相应的英文表达或简写,在相对简单的环境(对象数量少、针对性强)中,可以将一些名称由完整单词简写为单个字母,例如:

  • user 可以简写为 u
  • userID 可以简写 uid 
    若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头:
  1. var isExist bool
  2. var hasConflict bool
  3. var canManage bool
  4. var allowGitHook bool

变量命名惯例

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

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

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

  1. // A GonicMapper that contains a list of common initialisms taken from golang/lint
  2. var LintGonicMapper = GonicMapper{
  3. "API": true,
  4. "ASCII": true,
  5. "CPU": true,
  6. "CSS": true,
  7. "DNS": true,
  8. "EOF": true,
  9. "GUID": true,
  10. "HTML": true,
  11. "HTTP": true,
  12. "HTTPS": true,
  13. "ID": true,
  14. "IP": true,
  15. "JSON": true,
  16. "LHS": true,
  17. "QPS": true,
  18. "RAM": true,
  19. "RHS": true,
  20. "RPC": true,
  21. "SLA": true,
  22. "SMTP": true,
  23. "SSH": true,
  24. "TLS": true,
  25. "TTL": true,
  26. "UI": true,
  27. "UID": true,
  28. "UUID": true,
  29. "URI": true,
  30. "URL": true,
  31. "UTF8": true,
  32. "VM": true,
  33. "XML": true,
  34. "XSRF": true,
  35. "XSS": true,
  36. }

struct 规范

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

定义如下:

  1. type User struct{
  2. Username string
  3. Email string
  4. }

初始化如下:

  1. u := User{
  2. Username: "test",
  3. Email: "test@gmail.com",
  4. }

控制结构

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

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

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

  1. sum := 0
  2. for i := 0; i < 10; i++ {
  3. sum += i
  4. }

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

  1. f, err := os.Open(name)
  2. if err != nil {
  3. return err
  4. }
  5.  
  6. d, err := f.Stat()
  7. if err != nil {
  8. f.Close()
  9. return err
  10. }
  11.  
  12. codeUsing(f, d)

错误处理

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

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

  1. if err != nil {
  2. // error handling
  3. } else {
  4. // normal code
  5. }

采用下面的写法

  1. if err != nil {
  2. // error handling
  3. return // or continue, etc.
  4. }
  5. // normal code

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

  1. x, err := f()
  2. if err != nil {
  3. // error handling
  4. return
  5. }
  6. // use x

panic

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

import

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

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "os"
  6.  
  7. "kmg/a"
  8. "kmg/b"
  9.  
  10. "code.google.com/a"
  11. "github.com/b"
  12. )

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

  1. // 错误示例
  2. import “../net
  3.  
  4. // 正确的做法
  5. import github.com/repo/proj/src/net

goimports 会自动帮你格式化

参数传递

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

单元测试

单元测试文件名命名规范为 example_test.go

测试用例的函数名称必须以 Test 开头,例如:TestExample

参考:

https://gocn.io/article/1

http://blog.csdn.net/myzlhh/article/details/52269591

https://golang.org/doc/effective_go.html#commentary

Java Web 项目结构

Java Web应用程序的 推荐目录结构

Java se 与 Java web项目目录结构(最后为应用SSH框架目录结构)

Java Web开发基础(一)工程项目文档结构

基于Maven管理的JavaWeb项目目录结构参考

Java Web项目结构相关,怎么能更好的分层!

什么是 Java实体类?

Java 后台开发中model与entity(实体类)的区别

Java Web中的Action、Dao、Service、Model学习笔记

深入浅出Java MVC(Model View Controller) ---- (JSP + servlet + javabean实例)

POJO对象和Java类对象的区别和联系是什么?

[Go] 编码规范的更多相关文章

  1. Android的编码规范

    一.Android编码规范 1.学会使用string.xml文件 在我看来,当一个文本信息出现的次数大于一次的时候就必须要使用string.xml 比如一个保存按钮 , 不规范写法: <Butt ...

  2. PHP 高级编程(1/5) - 编码规范及文档编写

    PHP 高级程序设计学习笔记20140612 软件开发中的一个重要环节就是文档编写.他可以帮助未来的程序维护人员和使用者理解你在开发时的思路.也便于日后重新查看代码时不至于无从下手.文档还有一个重要的 ...

  3. 【原】JAVA SE编码规范

    /* * 编码规范: * 1.所有的命名遵循"见名知意"的原则 * 2.所有的命名不允许使用汉字或拼音 * 3.Java的工程命名建议使用小写,比如:oa.crm.cms... * ...

  4. 浅谈Android编码规范及命名规范

    前言: 目前工作负责两个医疗APP项目的开发,同时使用LeanCloud进行云端配合开发,完全单挑. 现大框架已经完成,正在进行细节模块上的开发 抽空总结一下Android项目的开发规范:1.编码规范 ...

  5. PHP编码规范PSR-2

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  6. Objective-C开发编码规范【转载】

    概要 Objective-C是一门面向对象的动态编程语言,主要用于编写iOS和Mac应用程序.关于Objective-C的编码规范,苹果和谷歌都已经有很好的总结: Apple Coding Guide ...

  7. 前端编码规范之CSS

    "字是门面书是屋",我们不会去手写代码,但是敲出来的代码要好看.有条理,这还必须得有一点约束~ 团队开发中,每个人的编码风格都不尽相同,有时候可能存在很大的差异,为了便于压缩组件对 ...

  8. 前端编码规范之JavaScript

    上次浅谈了下关于CSS的编码规范,大部分童鞋持赞同意见,仍存在一些童鞋不太理解这些规范的意义. 如果是个人或者小作坊开发,其实这些所谓的编码规范也没啥意思,因为大家写好的代码直接就给扔到网上去了,很少 ...

  9. Java Script 编码规范【转】

    Java Script 编码规范 以下文档大多来自: Google JavaScript 编码规范指南 Idiomatic 风格 参考规范 ECMAScript 5.1 注解版 EcmaScript ...

  10. python编码规范

    python编码规范 文件及目录规范 文件保存为 utf-8 格式. 程序首行必须为编码声明:# -*- coding:utf-8 -*- 文件名全部小写. 代码风格 空格 设置用空格符替换TAB符. ...

随机推荐

  1. 非常有助于理解二极管PN结原理的资料

    https://www.zhihu.com/question/60053574/answer/174137061 我理解的半导体 pn 结的原理,哪里错了? https://blog.csdn.net ...

  2. 『实践』Android之短信验证码(用的Mob短信验证)

    1.参考资料 Mob网站:http://www.mob.com/ Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android 教程:htt ...

  3. android 8.0变更

    Android 8.0 行为变更 Android 8.0 除了提供诸多新特性和功能外,还对系统和 API 行为做出了各种变更.本文重点介绍您应该了解并在开发应用时加以考虑的一些主要变更. 其中大部分变 ...

  4. postman发送json请求,使用案例

    介绍:  postman是一个很好的http模拟器,,可以发送get.post.put等各种请求,是测试服务接口相当好的工具. postman发送json请求,使用案例 发送json的具体步骤: 1. ...

  5. spring-service.xml 模板

    ssm模板 <?xml version="1.0" encoding="UTF-8"?>  <beans xmlns="http:/ ...

  6. POJ 3281 Dining(最大流+拆点)

    题目链接:http://poj.org/problem?id=3281 题目大意:农夫为他的 N (1 ≤ N ≤ 100) 牛准备了 F (1 ≤ F ≤ 100)种食物和 D (1 ≤ D ≤ 1 ...

  7. LOJ 10160 - 「一本通 5.2 练习 3」周年纪念晚会 / 没有上司的晚会

    题面 传送门 Ural 州立大学的校长正在筹备学校的 8080 周年纪念聚会.由于学校的职员有不同的职务级别,可以构成一棵以校长为根的人事关系树.每个资源都有一个唯一的整数编号,从 $1$ 到 $N$ ...

  8. scanf 输入加逗号(或者不加逗号)出现的异常及解决方案

    我们在写 C 语言代码通常 scanf 的格式控制部分都有两种习惯,加逗号与不加逗号,而这两种情况都会因为我们的不同输入习惯产生一定的问题,这里给出另一种方法. 1.不加逗号 #include< ...

  9. C语言:用指针求最大值和最小值

    用指针求数组最大值和最小值(10分) 题目内容: 用指针求含有十个元素的数组最大值和最小值 主函数参考 int main() { int a[10],i,maxnum,minnum; for(i=0; ...

  10. 如何使用 Java 删除 ArrayList 中的重复元素

    如何使用 Java 删除 ArrayList 中的重复元素 (How to Remove Duplicates from ArrayList in Java) Given an ArrayList w ...