<h3>1. gofmt 命令</h3>
大部分的格式问题可以通过 gofmt 来解决,gofmt 自动格式化代码,保证所有的 go 代码与官方推荐的格式保持一致,所有格式有关问题,都以gofmt的结果为准。所以,建议在提交代码库之前先运行一下这个命令。
<h3>2. 行长</h3>
一行最长不超过80个字符,超过的使用换行展示,尽量保持格式优雅。
<h3>3. 注释</h3>
在编码阶段应该同步写好 变量、函数、包 的注释,最后可以利用 godoc 命令导出文档。注释必须是完整的句子,句子的结尾应该用句号作为结尾(英文句号)。注释推荐用英文,可以在写代码过程中锻炼英文的阅读和书写能力。而且用英文不会出现各种编码的问题。
每个包都应该有一个包注释,一个位于 package 子句之前的块注释或行注释。包如果有多个 go 文件,只需要出现在一个 go 文件中即可。
<pre><span style="color:#008000;"> //</span><span style="color:#008000;"> ping包实现了常用的ping相关的函数</span>
package ping </pre>
<h3>4. 命名</h3>
<ul><li>需要注释来补充的命名就不算是好命名。</li><li>使用可搜索的名称:单字母名称和数字常量很难从一大堆文字中搜索出来。单字母名称仅适用于短方法中的本地变量,名称长短应与其作用域相对应。若变量或常量可能在代码中多处使用,则应赋其以便于搜索的名称。</li><li>做有意义的区分:Product 和 ProductInfo 和 ProductData 没有区别,NameString 和 Name 没有区别,要区分名称,就要以读者能鉴别不同之处的方式来区分 。</li><li>函数命名规则:驼峰式命名,名字可以长但是得把功能,必要的参数描述清楚,函数名应当是<span style="color:#993300;">动词</span>或<span style="color:#993300;">动词短语</span>,如 postPayment、deletePage、save。并依 Javabean 标准加上 get、set、is前缀。例如:xxx With 需要的参数名 And 需要的参数名 …..</li><li>结构体命名规则:结构体名应该是名词或名词短语,如 Custome、WikiPage、Account、AddressParser,避免使用 Manager、Processor、Data、Info、这样的类名,类名不应当是动词。</li><li>包名命名规则:包名应该为小写单词,不要使用下划线或者混合大小写。</li><li>接口命名规则:单个函数的接口名以”er”作为后缀,如 Reader,Writer。接口的实现则去掉“er”。</li></ul>
<span class="cnblogs_code_copy">
</span>
<pre> type Reader <span style="color:#0000ff;">interface</span><span style="color:#000000;"> {
Read(p []</span><span style="color:#0000ff;">byte</span>) (n <span style="color:#0000ff;">int</span><span style="color:#000000;">, err error)
}
</span><span style="color:#008000;">//</span><span style="color:#008000;"> 多个函数接口</span>
type WriteFlusher <span style="color:#0000ff;">interface</span><span style="color:#000000;"> {
Write([]</span><span style="color:#0000ff;">byte</span>) (<span style="color:#0000ff;">int</span><span style="color:#000000;">, error)
Flush() error
}</span></pre>
<span class="cnblogs_code_copy">
</span>
<h3>5. 常量</h3>
常量均需使用全部大写字母组成,并使用下划线分词:
<pre><span style="color:#0000ff;"> const</span> APP_VER = <span style="color:#800000;">"</span><span style="color:#800000;">1.0</span><span style="color:#800000;">"</span></pre>
如果是枚举类型的常量,需要先创建相应类型:
<pre> type Scheme <span style="color:#0000ff;">string</span>
<span style="color:#0000ff;">const</span><span style="color:#000000;"> (
HTTP Scheme </span>= <span style="color:#800000;">"</span><span style="color:#800000;">http</span><span style="color:#800000;">"</span><span style="color:#000000;">
HTTPS Scheme </span>= <span style="color:#800000;">"</span><span style="color:#800000;">https</span><span style="color:#800000;">"
)</span></pre>
<h3>6. 变量</h3>
变量命名基本上遵循相应的英文表达或简写,在相对简单的环境(对象数量少、针对性强)中,可以将一些名称由完整单词简写为单个字母,例如:
<ul><li><ul><li>user 可以简写为 u</li><li>userID 可以简写 uid</li><li>若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头:</li></ul></li></ul>
<pre><span style="color:#0000ff;"> var</span> isExist <span style="color:#0000ff;">bool</span>
<span style="color:#0000ff;">var</span> hasConflict <span style="color:#0000ff;">bool</span>
<span style="color:#0000ff;">var</span> canManage <span style="color:#0000ff;">bool</span>
<span style="color:#0000ff;">var</span> allowGitHook <span style="color:#0000ff;">bool</span></pre>
<h3>7. 变量命名惯例</h3>
变量名称一般遵循驼峰法,但遇到特有名词时,需要遵循以下规则:
<ul><li>如果变量为私有,且特有名词为首个单词,则使用小写,如:apiClient</li><li>其它情况都应当使用该名词原有的写法,如 APIClient、repoID、UserID</li><li>错误示例:UrlArray,应该写成 urlArray 或者 URLArray</li></ul>
下面列举了一些常见的特有名词:
<pre><span style="color:#800000;"> "</span><span style="color:#800000;">API</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">ASCII</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">CPU</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">CSS</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">DNS</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">EOF</span><span style="color:#800000;">"</span>,GUID<span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span>HTML<span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span>HTTP<span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span>HTTPS<span style="color:#800000;">"</span><span style="color:#800000;">,</span><span style="color:#800000;">"</span>ID<span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">IP<span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">JSON<span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">LHS<span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">QPS<span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">RAM<span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">RHS<span style="color:#800000;">"</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
<span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;"><span style="color:#800000;">"<span style="color:#800000;">RPC<span style="color:#800000;">"</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>, </span><span style="color:#800000;">"</span><span style="color:#800000;">SLA</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">SMTP</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">SSH</span><span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">TLS<span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">TTL<span style="color:#800000;">",</span></span></span></span></span></span></span><span style="color:#800000;">"</span><span style="color:#800000;">UI</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">UID</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">UUID</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">URI</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">URL</span><span style="color:#800000;">"</span>, <span style="color:#800000;">"</span><span style="color:#800000;">UTF8</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">VM</span><span style="color:#800000;">"</span>,<span style="color:#800000;">"</span><span style="color:#800000;">XML</span><span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">XSRF<span style="color:#800000;">",<span style="color:#800000;">"<span style="color:#800000;">XSS<span style="color:#800000;">"</span></span></span></span></span></span></span>
</pre>
<h3>8. struct规范</h3>
struct申明和初始化格式采用多行,定义如下:
<pre> type User <span style="color:#0000ff;">struct</span><span style="color:#000000;">{
Username </span><span style="color:#0000ff;">string</span><span style="color:#000000;">
Email </span><span style="color:#0000ff;">string</span><span style="color:#000000;">
}</span></pre>
初始化如下:
<pre> u :=<span style="color:#000000;"> User{
Username: </span><span style="color:#800000;">"</span><span style="color:#800000;">test</span><span style="color:#800000;">"</span><span style="color:#000000;">,
Email: </span><span style="color:#800000;">"</span><span style="color:#800000;">test@gmail.com</span><span style="color:#800000;">"</span><span style="color:#000000;">,
}</span></pre>
<h3>9. panic</h3>
尽量不要使用panic,除非你知道你在做什么
<h3>10. import</h3>
对 import 的包进行分组管理,用换行符分割,而且标准库作为分组的第一组。如果你的包引入了三种类型的包,标准库包,程序内部包,第三方包,建议采用如下方式进行组织你的包
<span class="cnblogs_code_copy">
</span>
<pre><span style="color:#000000;">package main
import (
</span><span style="color:#800000;">"</span><span style="color:#800000;">fmt</span><span style="color:#800000;">"</span>
<span style="color:#800000;">"</span><span style="color:#800000;">os</span><span style="color:#800000;">"</span>
<span style="color:#800000;">"</span><span style="color:#800000;">kmg/a</span><span style="color:#800000;">"</span>
<span style="color:#800000;">"</span><span style="color:#800000;">kmg/b</span><span style="color:#800000;">"</span>
<span style="color:#800000;">"</span><span style="color:#800000;">code.google.com/a</span><span style="color:#800000;">"</span>
<span style="color:#800000;">"</span><span style="color:#800000;">github.com/b</span><span style="color:#800000;">"</span><span style="color:#000000;">
)</span></pre>
<span class="cnblogs_code_copy">
</span>
goimports 会自动帮你格式化
<h3>11. 参数传递</h3>
<ul><li>对于少量数据,不要传递指针</li><li>对于大量数据的 struct 可以考虑使用指针</li><li>传入的参数是 map,slice,chan 不要传递指针,因为 map,slice,chan 是引用类型,不需要传递指针的指针</li></ul><h3>12. 单元测试</h3>
单元测试文件名命名规范:
example_test.go
测试用例的函数名称必须以 Test 开头,例如:
func TestExample