Go语言进阶-工程进阶

简介: Go语言进阶-工程进阶

协程:

协程与进程区别

协程:用户态,轻量级线程,栈MB级别。

线程:内核态,线程跑多个协程,栈KB级别。

使用:

go使用go关键字开启一个协程

csp:

并发提倡通过通信共享内存而非 通过共享内存实现通信

image.png

channel

channel实质上是一个循环队列
有两种初始化:
有缓冲区:make(chan int,n),n代表多少个缓冲区
无缓冲区:make(chan int,0)
当没有缓冲区时channel里面就不能有额外空间存放数据,因此当一个数据放入管道中,必须有数据接收管道里的数据,该进程才会继续向下运行,否则则会一直阻塞。

并发安全lock

go中sync中包中含有读锁和写锁对并发进行安全限制,锁的使用往往对一行操作进行锁操作。而go中对并发安全进行加锁的方式主要用sync包中的Mutex,RWMutex,WaitGroup,Once,Map这几个api进行操作

```
func (m Mutex) Lock() 获取互斥锁
func (m
Mutex) Unlock() 释放互斥锁

func (rw RWMutex) Lock() 获取写锁
func (rw
RWMutex) Unlock() 释放写锁

func (rw RWMutex) RLock() 获取读锁
func (rw
RWMutex) RUnlock() 释放读锁

func (rw *RWMutex) RLocker() Locker 返回一个实现Locker接口的读写锁

func (wg WaitGroup) Add(delta int) 计数器+1
func (wg
WaitGroup) Done() 计数器-1
func (wg *WaitGroup) Wait() 阻塞直到计数器变为0

...

go依赖管理

gopath

bin:项目编译的二进制文件
pkg:项目编译的中间产物,加速编译
src:项目源码

go vender

  • 项目目录下增加vendor文件,所有依赖包副本形式放在$ProjectRoot/vendor
  • 依赖寻址方式: vendor => GOPATH
  • 通过每个项目引入一份依赖的副本,
    解决了多个项目需要同一个package依赖的冲突问题。
  • 弊端:

image.png

go Module

  • 通过go.mod文件管理依赖包
  • 通过go get/go mod 指令工具管理依赖包
  • 目标:定义版本规则和管理项目依赖关系

    依赖管理三要素:

  • 1.配置文件,描述依赖go.mod
  • 2.中心仓库管理依赖库Pro
  • 3.本地工具 get/modgo

工具:

  • go get

image.png

  • go mod

image.png

测试:

单元测试:

图解:

image.png

规则:

  • 所有测试文件以_test.go结尾

image.png

  • func Testxxx(*testing.T)

image.png

  • 初始化逻辑放在TestMain中

image.png

示例:

image.png

assert

用于纠正错误

代码覆盖率

用于评估项目的测试水准

image.png
用大量测试用例覆盖测试函数的各种情况


  • 一般覆盖率:50%~60%,较高覆盖率80%+。
  • 测试分支相互独立、全面覆盖。
  • 测试单元粒度足够小,函数单一职责。

依赖

  • 幂等
  • 稳定

文件处理示例:

image.png

Mock 为函数打桩

基准测试:

  • 优化代码,需要对当前代码分析
  • 内置的测试框架提供了基准测试的能力
相关文章
|
7月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
7月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
1月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。
|
1月前
|
数据采集 JSON Go
Go语言实战案例:实现HTTP客户端请求并解析响应
本文是 Go 网络与并发实战系列的第 2 篇,详细介绍如何使用 Go 构建 HTTP 客户端,涵盖请求发送、响应解析、错误处理、Header 与 Body 提取等流程,并通过实战代码演示如何并发请求多个 URL,适合希望掌握 Go 网络编程基础的开发者。
|
2月前
|
JSON 前端开发 Go
Go语言实战:创建一个简单的 HTTP 服务器
本篇是《Go语言101实战》系列之一,讲解如何使用Go构建基础HTTP服务器。涵盖Go语言并发优势、HTTP服务搭建、路由处理、日志记录及测试方法,助你掌握高性能Web服务开发核心技能。
|
2月前
|
Go
如何在Go语言的HTTP请求中设置使用代理服务器
当使用特定的代理时,在某些情况下可能需要认证信息,认证信息可以在代理URL中提供,格式通常是:
187 0
|
3月前
|
JSON 编解码 API
Go语言网络编程:使用 net/http 构建 RESTful API
本章介绍如何使用 Go 语言的 `net/http` 标准库构建 RESTful API。内容涵盖 RESTful API 的基本概念及规范,包括 GET、POST、PUT 和 DELETE 方法的实现。通过定义用户数据结构和模拟数据库,逐步实现获取用户列表、创建用户、更新用户、删除用户的 HTTP 路由处理函数。同时提供辅助函数用于路径参数解析,并展示如何设置路由器启动服务。最后通过 curl 或 Postman 测试接口功能。章节总结了路由分发、JSON 编解码、方法区分、并发安全管理和路径参数解析等关键点,为更复杂需求推荐第三方框架如 Gin、Echo 和 Chi。
|
4月前
|
分布式计算 Go C++
初探Go语言RPC编程手法
总的来说,Go语言的RPC编程是一种强大的工具,让分布式计算变得简单如同本地计算。如果你还没有试过,不妨挑战一下这个新的编程领域,你可能会发现新的世界。
103 10
|
4月前
|
人工智能 监控 算法
Go语言GC:三色标记法工程启示
本文深入探讨了Go语言中垃圾回收(GC)机制的性能影响及优化策略。首先分析了GC可能成为性能瓶颈的原因,如延迟敏感场景下的服务响应时间突增问题。接着介绍了三色标记法的核心概念与工作流程,以及并发GC面临的挑战和写屏障的作用。文章还详细讲解了Go GC的完整流程,并提供了多种工程实践启示,包括减少分配频率、预分配内存、避免过度使用指针、合理设置GOGC参数以及监控GC指标等优化方法。最后总结了GC优化的核心策略,帮助开发者构建更高效、可靠的Go应用。
|
7月前
|
存储 缓存 监控
企业监控软件中 Go 语言哈希表算法的应用研究与分析
在数字化时代,企业监控软件对企业的稳定运营至关重要。哈希表(散列表)作为高效的数据结构,广泛应用于企业监控中,如设备状态管理、数据分类和缓存机制。Go 语言中的 map 实现了哈希表,能快速处理海量监控数据,确保实时准确反映设备状态,提升系统性能,助力企业实现智能化管理。
106 3