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

2024-05-14 02:48

本文主要是介绍我们必须遵循的 12 个 Go 语言最佳实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

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

本文旨在提供一个切实的指导,在 Go 语言中实现最佳实践和设计模式。这些编程技巧可以帮助开发者编写出较好的代码。你一定已经读过了 Go Tutorial 和 Effective 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 的一些小例子

文件名:demo.go

package mainimport "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 mainimport "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 errorreturn // or continue, etc.
}
// proceed to further

嵌套条件语句越少,读者越容易理解

如果 if 语句中包含初始化语句,例如:

if x, err := f(); err != nil {// handling errorreturn
} else {// use x
}

我们应该在代码中定义一个短变量,在之后的 if 语句中使用这个变量

x, err := f()
if err != nil {// handling errorreturn
}
// 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)}
}

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""golang.org/x/net/websocket"
)

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

10、点导入

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

package foo_testimport ("bar/testutil" // also imports "foo". "foo"
)

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

11、注释代码

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

// 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) {

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 语言最佳实践可以帮助你提高代码质量。我们也列出了其它许多技术的最佳实践,可以在 largest blog repository 找到。有其它问题可以通过 info@agiratech.com 联系我们

这篇关于我们必须遵循的 12 个 Go 语言最佳实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/987542

相关文章

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Spring Boot中定时任务Cron表达式的终极指南最佳实践记录

《SpringBoot中定时任务Cron表达式的终极指南最佳实践记录》本文详细介绍了SpringBoot中定时任务的实现方法,特别是Cron表达式的使用技巧和高级用法,从基础语法到复杂场景,从快速启... 目录一、Cron表达式基础1.1 Cron表达式结构1.2 核心语法规则二、Spring Boot中定