Go语言进阶与依赖管理|青训营

71 阅读3分钟

一、语言进阶

1.Goroutine:

goroutine是Go语言中轻量级的线程,与传统的操作系统线程相比,goroutine的创建和切换成本更低,可以充分利用多核处理器的优势。了解如何使用goroutine来实现并发任务的划分和调度是非常重要的。

2.Channel:

channel是goroutine之间的通信机制,它可以用于传递数据和同步运行。通过channel,我们可以实现线程安全的数据交换和共享。了解如何正确使用channel以及常见的channel设计模式,可以帮助我们避免竞态条件和死锁等并发问题。

3.并发模式:

并发编程中有很多常见的模式,例如生产者消费者模式、工作池模式和扇入扇出模式等。了解这些模式的原理和适用场景,可以帮助我们更加灵活地设计并发程序,提高性能和效率。

二、依赖管理

1.GOPATH:

在早期的Go语言版本中,使用GOPATH作为类似于工作空间的概念,所有的Go项目都需要放置在该目录下,并且依赖的第三方包也会存放在该目录下。这种方式存在一些问题,如全局共享、版本冲突等。

2.govendor和dep:

为了解决GOPATH的问题,社区推出了一些第三方的依赖管理工具,如govendordep。这些工具可以帮助开发者更好地管理项目的依赖,但是使用起来复杂度和学习曲线较高。

3.Go Modules:

从Go 1.11版本开始,官方引入了Go Modules作为官方的依赖管理解决方案。Go Modules使用go.modgo.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{}) 
    }

四、小感悟

  • 基础太差的原因,导致上课跟不上,经常就是,老师说完一句话,就直接从耳边穿过了,都理解不到是什么意思。
  • 因为不懂也不好意思问问题,导致疑问没得到及时的解决。
  • 总结就是:多看多做,多问多想。