原文地址:http://golanghome.com/post/550
Go编码规范指南
序言
看过很多方面的编码规范,可能每一家公司都有不同的规范,这份编码规范是写给我自己的,同时希望我们公司内部同事也能遵循这个规范来写Go代码。
如果你的代码没有办法找到下面的规范,那么就遵循标准库的规范,多阅读标准库的源码,标准库的代码可以说是我们写代码参考的标杆。
格式化规范
go默认已经有了gofmt工具,但是我们强烈建议使用goimport工具,这个在gofmt的基础上增加了自动删除和引入包.
go get golang.org/x/tools/cmd/goimports
不同的编辑器有不同的配置, sublime的配置教程:http://michaelwhatcott.com/gosublime-goimports/
LiteIDE默认已经支持了goimports,如果你的不支持请点击属性配置->golangfmt->勾选goimports
保存之前自动fmt你的代码。
行长约定
一行最长不超过80个字符,超过的请使用换行展示,尽量保持格式优雅。
go vet
vet工具可以帮我们静态分析我们的源码存在的各种问题,例如多余的代码,提前return的逻辑,struct的tag是否符合标准等。
go get golang.org/x/tools/cmd/vet
使用如下:
go vet .
package名字
保持package的名字和目录保持一致,尽量采取有意义的包名,简短,有意义,尽量和标准库不要冲突。
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”
变量申明
变量名采用驼峰标准,不要使用_
来命名变量名,多个变量申明放在一起
var(Foundbool
count int)
在函数外部申明必须使用var,不要采用:=
,容易踩到变量的作用域的问题。
自定义类型的string循环问题
如果自定义的类型定义了String方法,那么在打印的时候会产生隐藏的一些bug
type MyIntint
func (m MyInt)String()string{return fmt.Sprint(m)//BUG:死循环}
func(m MyInt)String()string{return fmt.Sprint(int(m))//这是安全的,因为我们内部进行了类型转换}
避免返回命名的参数
如果你的函数很短小,少于10行代码,那么可以使用,不然请直接使用类型,因为如果使用命名变量很
容易引起隐藏的bug
func Foo(a int, b int)(string, ok){}
当然如果是有多个相同类型的参数返回,那么命名参数可能更清晰:
func (f *Foo)Location()(float64, float64, error)
下面的代码就更清晰了:
// Location returns f's latitude and longitude.// Negative values mean south and west, respectively.
func (f *Foo)Location()(lat,long float64, err error)
错误处理
错误处理的原则就是不能丢弃任何有返回err的调用,不要采用_
丢弃,必须全部处理。接收到错误,要么返回err,要么实在不行就panic,或者使用log记录下来
error 信息
error的信息不要采用大写字母,尽量保持你的错误简短,但是要足够表达你的错误的意思。
长句子打印或者调用,使用参数进行格式化分行
我们在调用fmt.Sprint
或者log.Sprint
之类的函数时,有时候会遇到很长的句子,我们需要在参数调用处进行多行分割:
下面是错误的方式:
log.Printf(“A long format string:%s %d %d %s”, myStringParameter, len(a),
expected.Size, defrobnicate(“Anotherlongstringparameter”,
expected.Growth.Nanoseconds()/1e6))
应该是如下的方式:
log.Printf(“A long format string:%s %d %d %s”,
myStringParameter,
len(a),
expected.Size,
defrobnicate(“Anotherlongstringparameter”,
expected.Growth.Nanoseconds()/1e6,),)
注意闭包的调用
在循环中调用函数或者goroutine方法,一定要采用显示的变量调用,不要再闭包函数里面调用循环的参数
fori:=0;i<limit;i++{
go func(){DoSomething(i)}()//错误的做法
go func(i int){DoSomething(i)}(i)//正确的做法}
http://golang.org/doc/articles/race_detector.html#Race_on_loop_counter
在逻辑处理中禁用panic
在main包中只有当实在不可运行的情况采用panic,例如文件无法打开,数据库无法连接导致程序无法
正常运行,但是对于其他的package对外的接口不能有panic,只能在包内采用。
强烈建议在main包中使用log.Fatal来记录错误,这样就可以由log来结束程序。
注释规范
注释可以帮我们很好的完成文档的工作,写得好的注释可以方便我们以后的维护。详细的如何写注释可以
参考:http://golang.org/doc/effective_go.html#commentary
bug注释
针对代码中出现的bug,可以采用如下教程使用特殊的注释,在godocs可以做到注释高亮:
// BUG(astaxie):This divides by zero. var i float=1/0
http://blog.golang.org/2011/03/godocdocumentinggocode.html
struct规范
struct申明和初始化格式采用多行:
定义如下:
type Userstruct{UsernamestringEmailstring}
初始化如下:
u :=User{Username:"astaxie",Email:"astaxie@gmail.com",}
recieved是值类型还是指针类型
到底是采用值类型还是指针类型主要参考如下原则:
func(w Win)Tally(playerPlayer)int//w不会有任何改变
func(w *Win)Tally(playerPlayer)int//w会改变数据
更多的请参考:https://code.google.com/p/go-wiki/wiki/CodeReviewComments#Receiver_Type
带mutex的struct必须是指针receivers
如果你定义的struct中带有mutex,那么你的receivers必须是指针
相关推荐
uber-go/guide的翻译英语Uber Go 语言编码指南Uber是一家美国硅谷的科技公司,也是 Go 语言的早期采用者。其开源了很多 golang 项目,比如被 Gopher 圈广泛的zap、jaeger等。2018 年末 Uber 将内部的Go 风格规范开源...
Go语言安全编码规范 Java开发手册 JAVA安全编码规范参考 JAVA开发手册与安全编码规范 NET安全编码规范 OWASP安全编码规范快速参考指南 保险集团Web应用编码安全指南 保险行业机构代码编码规范 金融公司安全编码规范 ...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的语言,因其简洁的语法和高效的性能而被广泛应用于后端服务开发、网络编程等领域。本指南将深入探讨Go语言的安全特性,以及如何...
Go 语言安全编码规范是为了指导使用 Go 语言进行编程与 Web 开发的人员,遵循 OWASP 安全编码实践快速参考指南。该规范的目的是为了帮助开发人员避免常见错误,同时通过"实践方法"学习编程语言心得。 输入验证是 ...
Go语言安全编码规范-翻译.pdf JAVA安全编码规范参考.pdf JRT 0124-2014金融机构编码规范.pdf JRT0035-2007 保险行业机构代码编码规范(报批稿).pdf JRT0085-2012 证券投资基金编码规范.pdf JRT0086-2012 证券投资...
《Uber Go 语言编程规范中文版》是一份详细的Go语言编码指南,由知名科技公司Uber制定并开源。Uber作为Go语言的早期采用者,积累了丰富的经验,并将其内部的编程规范整理成文,供广大Go开发者参考。这份规范旨在提高...
**Uber Go语言编码规范中文版概述** Uber是一家全球知名的科技公司,其在软件开发领域有着严谨的代码风格和编码规范。对于Go语言,Uber也制定了详细的编程指导原则,旨在提高代码质量、可读性和团队协作效率。这个...
本项目" CodingStyle:各语言编码规范"致力于收集和整理多种编程语言的编码最佳实践,旨在为开发者提供一套统一的参考标准。 首先,我们来看C++的编码规范。C++是一门强大的面向对象编程语言,其规范通常包含以下...
- 第四部分:学习Go语言的最佳实践、编码规范,以及实用的代码片段。 - 第五部分:通过实战项目和云环境应用(如Google App Engine)加深理解,了解Go在实际开发中的应用。 书中的内容不仅包含理论知识,还提供了...
Go语言社区也相应地发展了一套编码规范,以帮助开发者编写出更规范、更易于理解和维护的代码。从提供的文件内容中,我们可以提炼出以下Go语言编程规范的知识点: 1. 代码格式化:Go语言拥有一个内置的代码格式化...
4. 最后一部分介绍Go语言的开发模式、编码规范,以及如何构建完整的Go项目,还涉及到Go语言在云端和Web应用中的应用。 此外,书中还会对比Go语言与其他编程语言的异同,提供实践案例,以及介绍Go语言在实际项目中的...
《Go语言编程规范中文版-Google出品》是Google官方针对Go语言制定的一份编码风格指南,旨在提升Go代码的可读性和一致性。这份规范不仅适用于Google内部的开发人员,也对外公开,为广大的Go程序员提供了参考。以下是...
Go语言,又称Golang,是由Google公司设计的一种静态类型的、垃圾回收的、编译型的、并发型且具有垃圾回收功能的编程语言。它旨在提高开发效率,兼顾运行速度,使得开发者能够在保持高效性能的同时,享受到简洁的语法...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收的编程语言。它的设计目标是简化并发编程,并提供高效的工具链支持,以提高开发者的生产力。《Go入门指南》这本书正是为初学者...
《USB 2.0与OTG规范及开发指南》是一份详尽的文档,旨在深入解析USB 2.0和On-The-Go(OTG)技术的规范与开发要点,适用于那些希望掌握这两种技术原理与实践应用的专业人士。USB 2.0作为高速数据传输接口的代表,其规范...
- **编码规范**:遵循Go语言的最佳实践指南,提高代码质量。 - **调试技巧**:掌握有效的调试方法,快速定位和解决问题。 - **性能优化**:利用Go语言的特性进行高效的性能调优。 - **持续集成**:设置自动化构建和...
**Go语言**, 又称为 **Golang**, 是一种开源的编程语言, 由Google的Robert Griesemer、Rob Pike及Ken Thompson设计开发。它简洁高效, 特别适合于构建简单、可靠且高效的软件。 对于初学者而言, 下面是一些推荐的...
Golint的目的是帮助开发者遵循Go语言的编码风格指南,这些指南通常被称为“Go范式”或“Go idioms”。它主要关注的是代码格式、命名约定以及结构体设计等方面,帮助开发者发现并修正不符合标准的代码。使用Golint,...