Go语言工程进阶 | 青训营

49 阅读5分钟

1.并发编程

老师上课为我们简单介绍了,并发编程的四种分类,分别为

协程Goroutine

通道Channel

锁Lock

线程同步WaitGroup

Goroutine(协程):Goroutine 是 Golang 并发编程的核心概念之一。它是一种轻量级线程,由 Go 运行时环境管理。与传统的操作系统线程相比,Goroutine 的创建和销毁开销很小。通过关键字"go"可以启动一个 Goroutine。\n\nfunc main() {\n go myFunction() // 启动一个 Goroutine

func main() {

go myFunction() // 启动一个 Goroutine

// 主程序继续执行其他操作 }

Channel(通道):Channel 是 Goroutine 之间进行通信的机制,用于在 Goroutine 之间传递数据。它提供了同步和数据共享的功能,可以有效地避免竞态条件(Race Condition)和其他并发问题。

func main() {

ch := make(chan int) // 创建一个整数类型的通道

go sendData(ch) // 启动一个 Goroutine 发送数据

data := <-ch // 从通道接收数据

fmt.Println(data) // 输出接收到的数据 }

func sendData(ch chan int) {

ch <- 10 // 向通道发送数据 }

互斥锁(Mutex):互斥锁用于保护共享资源,避免多个 Goroutine 同时修改数据而导致的竞态条件。通过使用互斥锁,可以确保在某一时刻只有一个 Goroutine 可以访问共享资源.

import "sync"

var counter int

var mutex sync.Mutex

func main() {

var wg sync.WaitGroup

for i := 0; i < 10; i++ {

wg.Add(1)

go increment(&wg)

}

wg.Wait()

fmt.Println("Counter:", counter) }

func increment(wg *sync.WaitGroup) {

mutex.Lock()

counter++

mutex.Unlock()

wg.Done() }

2.依赖管理 老师为我们介绍了这三种,同时也是go依赖管理的演变历程。

Gopath

Go Vendor

Go Module

Go modules 是 Go 语言的依赖解决方案,发布于 Go1.11,成长于 Go1.12,丰富于 Go1.13,正式于 Go1.14 推荐在生产上使用。 Go moudles 目前集成在 Go 的工具链中,只要安装了 Go,自然而然也就可以使用 Go moudles 了,而 Go modules 的出现也解决了在 Go1.11 前的几个常见争议问题:Go 语言长久以来的依赖管理问题。“淘汰”现有的 GOPATH 的使用模式。统一社区中的其它的依赖管理工具(提供迁移功能)。

3.单元测试 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java 里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。

    单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试。单元测试使用方法

1、要开始一个单元测试,需要准备一个 go 源码文件,在命名文件时需要让文件必须以_test结尾。

2、单元测试源码文件可以由多个测试用例组成,每个测试用例函数需要以Test为前缀

func TestXXX( t *testing.T )

3、测试用例文件不会参与正常源码编译,不会被包含到可执行文件中。

4、测试用例文件使用 go test 指令来执行,没有也不需要 main() 作为函数入口。所有在以_test结尾的源码内以Test开头的函数会自动被执行。

5、测试用例可以不传入 *testing.T 参数

6、新建的测试文件一般和源文件 放同一目录

7、go单元测试,引入包 testing

4.老师为我们详细介绍了一个用go long语言做的项目实战的内容

需求 实现一个展示话题(标题,文字描述)和回帖列表的后端http接口; 本地文件存储数据

组件及技术点

web框架:Gin - github.com/gin-gonic/g…

了解go web框架的简单使用

分层结构设计:github.com/bxcodec/go-…

了解分层设计的概念

文件操作:读文件pkg.go.dev/io

数据查询:索引www.baike.com/wikiid/5527…

5.高质量编程

Go 语言开发者 Dave Cheney 给出了三条编程原则,在编程中我们应该尽可能遵循这些原则。

简单性:消除“多余的复杂性”,以简单清晰的逻辑写代码。

可读性:编写可维护代码的第一步是确保代码可读。

生产力:团队整体工作效率非常重要

注释: 包中声明的每个公共的符号(变量、常量、函数…)都要添加注释;任何既不明显也不简短的公共功能必须予以注释;无论长度或复杂度如何,对库中的任何函数都必须进行注释。

注释应该解释代码的作用、代码是如何做的以及代码的实现原因,还应该解释代码什么情况会出错。

代码格式:

推荐使用 gofmt 自动格式化代码。

gofmt 是 Go 语言官方提供的工具,能自动格式化 Go 语言代码为官方统一风格,常见 IDE 都支持方便的配置。此外 goimports 也是 Go 语言官方提供的工具,可以实现自动增删依赖的包引用、将依赖包按字母序排序并分类。

命名规范

变量: 简洁胜于冗长。 缩略词全大写(比如 ServeHTTP),但当其位于变量开头且不需要导出时,使用全小写(比如 xmlHTTPRequest)。 变量距离其被使用的地方越远,则需要携带越多的上下文信息。

函数: 函数名不携带包名的上下文信息,因为包名和函数名总是成对出现的。 函数名尽量简短。 当名为 foo 的包某个函数返回类型 Foo 时,可以省略类型信息而不导致歧义。 当名为 foo 的包某个函数返回类型 T 时(T 并不是 Foo),可以在函数名中加入类型信息。

package: 只由小写字母组成,不包含大写字母和下划线等字符。 简短并包含一定的上下文信息,例如 schema、task 等。\n不要与标准库同名。