咱们必须遵循的 12 个 Go 语言最佳实践

本文旨在提供一个切实的指导,在 Go 语言中实现最佳实践和设计模式。这些编程技巧能够帮助开发者编写出较好的代码。golang

为了让你们对这些编程技巧有更加深入的认识,我在讨论这些最佳实践的时候会附加一些示例代码。web

那些编写了许多优秀代码的大师们,一直在使用一些 Go 语言编程实践或者说是编程技巧。编程

下面列出了其中一些最好的编程实践,可使写出的代码简单、易懂而且易于维护设计模式

一、使用 gofmtbash

二、经过首先处理错误来避免代码嵌套websocket

三、错误字符串socket

四、错误处理函数

五、尽可能避免代码重复测试

六、变量名声明ui

七、用类型选择语句来处理特例

八、在类型选择语句中声明变量

九、重要的代码要放在源文件的前面

十、点导入

十一、注释代码

十二、注释语句规范

一、使用 gofmt

对源代码执行 gofmt 命令,会自动修正大部分粗心致使的问题。几乎全世界的 Go 语言开发者都在用 gofmt。

gofmt 首先读取源代码,而后输出通过缩进、垂直对齐甚至规范注释后的代码。

命令和选项

gofmt 文件名 - 输出格式化后的代码

gofmt -w 文件名 - 从新格式化代码并更新文件

gofmt -r'rule' 文件名 - 格式化代码前执行指定的规则

gofmt 包所在的路径 - 格式化整个包下的源文件

下面是使用 gofmt 的一些小例子

文件名:demo.go

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);
                      }复制代码

输入命令:$ gofmt demo.go

输出结果:

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)
}复制代码

二、经过首先处理错误来避免代码嵌套

避免使用多重条件或者嵌套条件,当咱们处理后面的代码前须要处理错误,例以下面的代码

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复制代码

三、错误字符串

错误字符串首字母不该该大写(除非是以一些特殊的名词或者缩写开头)。

例如:

fmt.Errorf("Something went wrong") 应该写成 fmt.Errorf("something went wrong")

四、错误处理

不要用 _ 来忽略错误。若是一个函数可能返回错误信息,检查函数的返回值 ,确认函数是否执行成功了。更好的作法是处理这个错误并返回,否则的话若是出现任何异常程序会产生一个 panic 错误

不要用 panic 错误

不要在正常处理流程中使用 panic, 那种状况下能够用 error 和多重返回值。

五、尽量避免重复

若是你想在控制模块和数据模块使用同一个类型结构,建立一个公共文件,在那里声明这个类型

六、变量名声明

在 Go 编程中最好用短的变量名,尤为是那些做用域比较有限的局部变量

c 而不是 lineCount

i 而不是 sliceIndex

一、基本规则:距离声明的地方越远,变量名须要越具可读性。

二、做为一个函数接收者,一、2 个字母的变量比较高效。

三、像循环指示变量和输入流变量,用一个单字母就能够。

四、越不经常使用的变量和公共变量,须要用更具说明性的名字。

七、用类型选择语句来处理特例

若是你不肯定 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)
}
}复制代码

八、在类型选择语句中声明变量

在类型选择语句中声明的变量,在每一个分支中会自动转化成正确的类型

例如:

func Write(v interface{}) {
switch x := v.(type) {
case string:
  fmt.Printf(“%T\n”,x)
case int:
  fmt.Printf(“%T\n”,x)
}
}复制代码

九、重要的代码要放在源文件的前面

若是你有像版权声明、构建标签、包注释这样的重要信息,尽可能写在源文件的靠前位置。 咱们能够用空行把导入语句分红若干个组,标准库放在最前面。

import (
 "fmt"
 "io"
 "log"
 "golang.org/x/net/websocket"
)复制代码

在接下来的代码中,首先写重要的类型,在最后写一些辅助型的函数和类型。

十、点导入

点导入能够测试循环依赖。而且它不会成为被测试代码的一部分:

package foo_test

import (
 "bar/testutil" // also imports "foo"
 . "foo"
)复制代码

这样的状况下,测试代码不能放在 foo 包中,由于它引入了 bar/testutil包,而它导入了 foo。因此咱们用点导入 的形式让文件伪装是包的一部分,而实际上它并非。除了这个使用情形外,最好不要用点导入。由于它会让读者阅读代码时更加困难,由于很难肯定像 Quux 这样的名字是当前包的顶层声明仍是引入的包。

十一、注释代码

在包名字以前添加包相关的注释

// Package playground registers an HTTP handler at “/compile” that
// proxies requests to the golang.org 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) {复制代码

十二、注释语句规范

即便注释语句看上去有一些冗余,也须要是一个完整的句子,。这样会让它们在 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: http://www.agiratech.com/12-best-golang-agile-practices-we-must-follow/

做者:Reddy Sai 译者:jettyhan 校对:polaris1119

相关文章
相关标签/搜索