我们必须遵循的 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

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

Go Playground 在线编程环境

For all examples in this and the next chapter, we will use Go Playground. Go Playground represents a web service that can run programs written in Go. It can be opened in a web browser using the follow

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别? 在 Go 语言中,channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型:无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为:无缓冲的 channel 是一种同步的通信方式,发送和接收必须同时发生。如果一个 goroutine 试图通过无缓冲 channel

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,