一、语言进阶
1.Goroutine:
goroutine是Go语言中轻量级的线程,与传统的操作系统线程相比,goroutine的创建和切换成本更低,可以充分利用多核处理器的优势。了解如何使用goroutine来实现并发任务的划分和调度是非常重要的。
2.Channel:
channel是goroutine之间的通信机制,它可以用于传递数据和同步运行。通过channel,我们可以实现线程安全的数据交换和共享。了解如何正确使用channel以及常见的channel设计模式,可以帮助我们避免竞态条件和死锁等并发问题。
3.并发模式:
并发编程中有很多常见的模式,例如生产者消费者模式、工作池模式和扇入扇出模式等。了解这些模式的原理和适用场景,可以帮助我们更加灵活地设计并发程序,提高性能和效率。
二、依赖管理
1.GOPATH:
在早期的Go语言版本中,使用GOPATH作为类似于工作空间的概念,所有的Go项目都需要放置在该目录下,并且依赖的第三方包也会存放在该目录下。这种方式存在一些问题,如全局共享、版本冲突等。
2.govendor和dep:
为了解决GOPATH的问题,社区推出了一些第三方的依赖管理工具,如govendor和dep。这些工具可以帮助开发者更好地管理项目的依赖,但是使用起来复杂度和学习曲线较高。
3.Go Modules:
从Go 1.11版本开始,官方引入了Go Modules作为官方的依赖管理解决方案。Go Modules使用go.mod和go.sum文件来存储项目的依赖信息,并且支持语义化版本控制。使用Go Modules,我们可以方便地下载、更新和管理项目的依赖关系,避免版本冲突和依赖问题。
三、测试
1.单元测试:
Go语言内置了一个强大的测试框架,可以帮助我们编写单元测试代码。对于每个函数或方法,我们可以编写相应的测试函数,使用断言来验证函数的行为是否符合预期。通过单元测试,我们可以快速定位代码中的问题,并及时进行修复。
2.测试覆盖率:
代码的测试覆盖率是衡量测试质量的一个重要指标。通过使用Go语言的测试工具,我们可以了解代码中哪些部分被测试覆盖到,哪些部分没有被覆盖到。通过分析测试覆盖率报告,我们可以增加测试用例,提高代码的覆盖率,进一步提升代码的质量。
3.测试代码:
package main
import (
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock" )
// 定义接口
type Database interface {
GetData() string }
// Mock对象
type MockDatabase struct {
mock.Mock }
// 实现接口方法
func (m *MockDatabase) GetData() string {
args := m.Mock.Called() return args.String(0)
}
func TestGetData(t *testing.T) {
// 创建Mock对象
mockDB := new(MockDatabase)
// 设置Mock行为
mockDB.On("GetData").Return("Mocked data")
// 使用Mock对象进行测试
result := mockDB.GetData()
// 断言结果
assert.Equal(t, "Mocked data", result)
// 验证Mock行为是否被调用
mockDB.AssertExpectations(t)
}
func main() {
// 调用测试函数
TestGetData(&testing.T{})
}
四、小感悟
- 基础太差的原因,导致上课跟不上,经常就是,老师说完一句话,就直接从耳边穿过了,都理解不到是什么意思。
- 因为不懂也不好意思问问题,导致疑问没得到及时的解决。
- 总结就是:多看多做,多问多想。