我们必须遵循的12个Go语⾔最佳实践
本⽂旨在提供⼀个切实的指导,在 Go 语⾔中实现最佳实践和设计模式。这些编程技巧可以帮助开发者编写出较好的代码。为了让⼤家对这些编程技巧有更加深刻的认识,我在讨论这些最佳实践的时候会附加⼀些⽰例代码。
那些编写了许多优秀代码的⼤师们,⼀直在使⽤⼀些 Go 语⾔编程实践或者说是编程技巧。
下⾯列出了其中⼀些最好的编程实践,可以使写出的代码简单、易懂并且易于维护
1、使⽤ gofmt
2、通过⾸先处理错误来避免代码嵌套
3、错误字符串
4、错误处理
5、尽量避免代码重复
6、变量名声明
7、⽤类型选择语句来处理特例
8、在类型选择语句中声明变量
9、重要的代码要放在源⽂件的前⾯
10、点导⼊
11、注释代码
12、注释语句规范
1、使⽤ gofmt
对源代码执⾏ gofmt 命令,会⾃动修正⼤部分粗⼼导致的问题。⼏乎全世界的 Go 语⾔开发者都在⽤ gofmt。
gofmt ⾸先读取源代码,然后输出经过缩进、垂直对齐甚⾄规范注释后的代码。
命令和选项
gofmt ⽂件名 - 输出格式化后的代码
gofmt -w ⽂件名 - 重新格式化代码并更新⽂件
gofmt -r'rule' ⽂件名 - 格式化代码前执⾏指定的规则
gofmt 包所在的路径 - 格式化整个包下的源⽂件
下⾯是使⽤ gofmt 的⼀些⼩例⼦
⽂件名:
package main
import "fmt"
// this is demo to format code
// with gofmt command
var a int=10;
var b int=15;
var c string= "Welcome to Agira";
func print(){
fmt.Println("Value for a,b and c is : ");
fmt.Println(a);
fmt.Println((b));
fmt.Println(c);
}
输⼊命令:$
输出结果:
package main
import "fmt"
/
/ this is demo to format code
// with gofmt command
var a int = 10
var b int = 15
var c string = “Welcome to Agira”
func print() {
fmt.Println("Value for a,b and c is : ")
fmt.Println(a)
fmt.Println((b))
fmt.Println(c)
}
2、通过⾸先处理错误来避免代码嵌套
避免使⽤多重条件或者嵌套条件,当我们处理后⾯的代码前需要处理错误,例如下⾯的代码
err := request()
if err != nil {
// handling error
} else {
// normal code
}
我们可以⽤下⾯的⽅式代替
err := request()
if err != nil {
/
/ handling error
return // or continue, etc.
}
// proceed to further
嵌套条件语句越少,读者越容易理解
如果 if 语句中包含初始化语句,例如:
if x, err := f(); err != nil {
// handling error
return
} else {
// use x
}
我们应该在代码中定义⼀个短变量,在之后的 if 语句中使⽤这个变量
x, err := f()
if err != nil {
// handling error
return
}
// use x
3、错误字符串
错误字符串⾸字母不应该⼤写(除⾮是以⼀些特殊的名词或者缩写开头)。
例如:
fmt.Errorf("Something went wrong") 应该写成 fmt.Errorf("something went wrong")
4、错误处理
不要⽤ _ 来忽略错误。如果⼀个函数可能返回错误信息,检查函数的返回值,确认函数是否执⾏成功了。更好的做法是处理这个错误并返回,不然的话如果出现任何异常程序会产⽣⼀个 panic 错误
不要⽤ panic 错误
不要在正常处理流程中使⽤ panic, 那种情况下可以⽤ error 和多重返回值。
5、尽可能避免重复
如果你想在控制模块和数据模块使⽤同⼀个类型结构,创建⼀个公共⽂件,在那⾥声明这个类型
6、变量名声明
在 Go 编程中最好⽤短的变量名,尤其是那些作⽤域⽐较有限的局部变量
⽤c⽽不是lineCount
⽤i⽽不是sliceIndex
1、基本规则:距离声明的地⽅越远,变量名需要越具可读性。
2、作为⼀个函数接收者,1、2 个字母的变量⽐较⾼效。
3、像循环指⽰变量和输⼊流变量,⽤⼀个单字母就可以。
4、越不常⽤的变量和公共变量,需要⽤更具说明性的名字。
7、⽤类型选择语句来处理特例
如果你不确定 iterface{} 是什么类型,就可以⽤类型选择语句
例如:
func Write(v interface{}) {
switch v.(type) {
case string:
s := v.(string)
fmt.Printf(“%T\n”,s)
case int:
i := v.(int)
fmt.Printf(“%T\n”,i)
}
go语言字符串转数组}
8、在类型选择语句中声明变量
在类型选择语句中声明的变量,在每个分⽀中会⾃动转化成正确的类型
例如:
func Write(v interface{}) {
switch x := v.(type) {
case string:
fmt.Printf(“%T\n”,x)
case int:
fmt.Printf(“%T\n”,x)
}
}
9、重要的代码要放在源⽂件的前⾯
如果你有像版权声明、构建标签、包注释这样的重要信息,尽量写在源⽂件的靠前位置。我们可以⽤空⾏把导⼊语句分成若⼲个组,标准库放在最前⾯。
import (
"fmt"
"io"
"log"
"/x/net/websocket"
)
在接下来的代码中,⾸先写重要的类型,在最后写⼀些辅助型的函数和类型。
10、点导⼊
点导⼊可以测试循环依赖。并且它不会成为被测试代码的⼀部分:
package foo_test
import (
"bar/testutil" // also imports "foo"
. "foo"
)
这样的情况下,测试代码不能放在 foo 包中,因为它引⼊了 bar/testutil包,⽽它导⼊了 foo。所以我们⽤点导⼊的形式让⽂件假装是包的⼀部分,⽽实际上它并不是。除了这个使⽤情形外,最好不要⽤点导⼊。因为它会让读者阅读代码时更加困难,因为很难确定像 Quux 这样的
名字是当前包的顶层声明还是引⼊的包。
11、注释代码
在包名字之前添加包相关的注释
// Package playground registers an HTTP handler at “/compile” that
// proxies requests to playground service.
package playground
出现在 godoc 中的标识符,需要适当的注释
// Author represents the person who wrote and/or is presenting the document.
type Author struct {
Elem []Elem
}
// TextElem returns the first text elements of the author details.
// This is used to display the author’ name, job title, and company
// without the contact details.
func (p *Author) TextElem() (elems []Elem) {
12、注释语句规范
即使注释语句看上去有⼀些冗余,也需要是⼀个完整的句⼦,。这样会让它们在 godoc 中有更的格式化效果。注释需要以被注释的名字开头,以点号结尾。
// Request represents a request to run a command.
type Request struct { …
// Encode writes the JSON encoding of req to w.
func Encode(w io.Writer, req *Request) { … and so on.
希望这些 Go 语⾔最佳实践可以帮助你提⾼代码质量。我们也列出了其它许多技术的最佳实践。
via: www.agiratech/12-best-golang-agile-practices-we-must-follow/
作者:Reddy Sai 译者:jettyhan 校对:polaris1119
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论