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

这篇具有很好参考价值的文章主要介绍了Go 语言进阶与依赖管理 | 青训营。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Powered by:NEFU AB-IN

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

  • GO语言工程实践课后作业:实现思路、代码以及路径记录

语言进阶

Go可以充分发挥多核优势,高效运行

Goroutine是Go语言中的协程,一种轻量级的线程,由Go语言的运行时管理,可以实现高并发的程序设计,由于轻量级的特性,goroutine可以创建成千上万个,而且消耗的资源也相对较少。

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

在函数前加入go关键字,为一个函数创建协程运行

package main

import (
   "fmt"
   "time"
)

func hello(i int) {
   fmt.Println("hello goroutine : " + fmt.Sprint(i))
}

func HelloGoRoutine() {
   for i := 0; i < 5; i++ {
      go func(j int) {
         hello(j)
      }(i) // 向函数传入i参数,作为j的值
   }
   time.Sleep(time.Second)
}

func main() {
   HelloGoRoutine()
}

/*
 * hello goroutine : 4
 * hello goroutine : 2
 * hello goroutine : 1
 * hello goroutine : 3
 * hello goroutine : 0
 */

运行结果是乱序的表示是并行运行的


CSP(Communicating Sequential Processes)通信顺序进程,是Go语言中重要的并发模型。

主要特征有

  1. 顺序进程:每个进程内部按顺序执行。
  2. 通信进程:进程间通过通信(Message Passing)来协作。
  3. 数据流:程序通过在进程间传递数据来工作。

Go语言的CSP实现主要通过goroutine和channel

  • goroutine作为顺序执行的进程
  • channel用于goroutine间的通信

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

无缓冲通道(同步通道)

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

在Go语言中,通过通信来共享内存是一种并发编程的思想,即通过goroutine之间的通信来进行数据共享,而不是直接共享内存空间。

具体来说,当多个goroutine需要共享数据时,传统的做法是使用共享内存的方式,即使用互斥锁等机制来控制对共享变量的访问。但在Go语言中,引入了一种更优雅的方式,即使用通道(channel)来实现数据共享。

package main

import "fmt"

func CalSquare() {
   src := make(chan int)     //   生产无缓冲
   dest := make(chan int, 3) //   消费缓冲3个元素
   
   // 子协程发送0-9数字
   go func() {
      defer close(src)
      for i := 0; i < 10; i++ {
         src <- i
      }
   }()

   // 子协程计算输入数字的平方
   go func() {
      defer close(dest)
      for i := range src {
         dest <- i * i
      }
   }()

   // 主协程输出最后的平方数
   for i := range dest {
      // 复杂操作
      // ...
      fmt.Println(i)
   }

}

func main() {
   CalSquare()
}

sync.WaitGroup是Go语言中的一个常用同步工具,可以用于等待一组goroutine结束。
内部维护了一个计数器,暴露add done wait三个方法

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

之前例子的优化

/*
 * @Author: NEFU AB-IN
 * @Date: 2023-08-24 15:15:22
 * @FilePath: \GoTest\11\11.go
 * @LastEditTime: 2023-08-24 15:17:01
 */
package main

import (
	"fmt"
	"sync"
)

func hello(i int) {
	fmt.Println("hello goroutine : " + fmt.Sprint(i))
}

func HelloGoRoutine() {
	var wg sync.WaitGroup
	wg.Add(5)
	for i := 0; i < 5; i++ {
		go func(j int) {
			defer wg.Done()
			hello(j)
		}(i)
	}
	wg.Wait()
}

func main() {
	HelloGoRoutine()
}

/*
 * hello goroutine : 4
 * hello goroutine : 2
 * hello goroutine : 1
 * hello goroutine : 3
 * hello goroutine : 0
 */


依赖管理

原生SDK(Software Development Kit)是指为特定操作系统或平台开发应用程序的软件工具包。它包含了一系列的开发工具和文档,用于帮助开发人员创建、测试和部署应用程序。原生SDK通常由操作系统或平台的开发者提供,可以让开发者利用操作系统或平台的特定功能和特性,开发高性能、可靠的应用程序。

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

go path

弊端:无法实现package多版本控制
Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

go vendor

弊端:依赖关系隐藏在vendor中,理解和维护都更困难。依赖关系隐藏在vendor中,理解和维护都更困难。

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

go moudle
(类似于Java里的maven)

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

${major}.${minor}.${patch}

major为大版本,patch为bug修复版本,如v1.3.0

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java


依赖图

保证v1.3和v1.4是兼容的
Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java


依赖分发 - go proxy

其实是个服务站点(中心仓库管理依赖库),缓存仓库和版本,直接从proxy拉取依赖

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

GOPROXY 是用逗号分隔的URL列表

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

go get

  • 下载包的源码
  • 解压到GOPATH下
  • 解析并下载依赖
  • 缓存各版本的依赖
  • 会更新go.mod文件

go mod

  • init
  • download
  • tidy

测试

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

单元测试

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

比如

func Add(a int, b int) int{
  return a+b
}

func TestAdd(t *testing.T) {
  output:=Add(1, 2)
  expectOutput:=3
  if output != expectOutput{
    t.Error("Add failed")
  }
}

运行go test xxx.go 即可

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

assert

Go语言内置的testing包提供了assert包来进行单元测试的断言,assert能大大简化测试代码,不需要过多的if条件判断,只要最终结果不符合断言,就会自动标记为测试失败。

package Test

import (
   "github.com/stretchr/testify/assert"
   "testing"
)

func Add(a int, b int) int {
   return a + b
}

func TestAdd(t *testing.T) {
   output := Add(1, 2)
   expectOutput := 3
   assert.Equal(t, expectOutput, output)
}

覆盖率

  • 当一个程序有多个分支时,就会产生多种测试案例,如果所有的测试案例都符合结果,那覆盖率就是100%。
  • 运行 go test xxx.go --cover,可以查看测试的覆盖率。
  • 一般覆盖率在50%~60%,较高覆盖率在80%+
  • 测试分支相互独立,全面覆盖

Go 语言进阶与依赖管理 | 青训营,Go,BackEnd,golang,服务器,java

Mock测试

如果有一些外部依赖,可以通过mock实现
mock函数是用来模拟或替代指定函数的行为,以便在测试中控制函数的返回值或行为。

打桩是指在测试过程中为函数设置预期的返回值或行为,以确保测试代码的可重复性和可控性。通常使用mock函数来进行打桩操作,通过设置mock函数的返回值或行为,模拟特定情况下函数的行为,以便进行测试或验证。

基准测试

分析系统性能时,在本地会比较方便

基准测试是一种评估计算机系统、硬件或软件性能的方法。它通过运行一系列标准化的测试程序,以衡量系统在特定负载条件下的表现,从而提供了系统性能的参考标准或基准值。基准测试可以用于比较不同硬件或软件配置之间的性能差异,优化系统性能,或者评估系统变化对性能的影响。
基准测试通常涉及多个方面的测试,包括计算能力、内存管理、磁盘或存储访问、网络吞吐量等,并通过测量和记录相关性能指标,如处理速度、响应时间、吞吐量等来评估系统的性能。基准测试可以在实验室环境中进行,也可在真实场景中进行。
基准测试的结果可以用于为购买决策提供参考,评估系统在实际使用中的适应性,或者用于系统优化和调整,以达到更好的性能和效率。基准测试在计算机硬件和软件开发、系统管理和性能优化等领域都有广泛的应用。文章来源地址https://www.toymoban.com/news/detail-670774.html


到了这里,关于Go 语言进阶与依赖管理 | 青训营的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go 语言的实战案例 SOCKS5 代理 | 青训营

    Powered by: NEFU AB-IN GO语言工程实践课后作业:实现思路、代码以及路径记录 代理是指在计算机网络中,代理服务器充当客户端和目标服务器之间的中介。它接收来自客户端的请求,然后将请求转发给目标服务器,再将目标服务器的响应返回给客户端。 用途 : 匿名浏览 :Soc

    2024年02月10日
    浏览(30)
  • Go 语言入门指南: 环境搭建、基础语法和常用特性解析 | 青训营

    Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。 Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且

    2024年02月14日
    浏览(27)
  • 【字节跳动青训营】后端笔记整理-3 | Go语言工程实践之测试

    **本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金:🔗Go语言工程实践之测试 | 青训营 目录 一、概述 1、回归测试 2、集成测试 3、单元测试 二、单元测试 1、流程 2、规则 3、单元测试的例子 4、assert 5、覆盖率

    2024年02月15日
    浏览(29)
  • 【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

    **本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金:🔗Go语言入门指南:基础语法和常用特性解析 | 青训营 本文主要梳理自 第六届字节跳动青训营(后端组)-Go语言原理与实践第一节(王克纯老师主讲) 。同时

    2024年02月13日
    浏览(40)
  • Go 语言并发编程 及 进阶与依赖管理

    协程可以理解为 轻量级线程 ; Go更适 合高并发场景原因 之一: Go语言 一次可以创建上万协成 ; “快速”: 开多个协成 打印。 go func() : 在 函数前加 go 代表 创建协程 ; time.Sleep() : 协程阻塞,使主协程 在 子协程结束前阻塞不退出 ; 乱序输出 说明并行 ; 通过通信共享内

    2024年02月13日
    浏览(34)
  • 【字节跳动青训营】后端笔记整理-4 | Go框架三件套之GORM的使用

    **本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金。 我的go开发环境: *本地IDE:GoLand 2023.1.2 *go:1.20.6 *MySQL:8.0 本文介绍Go框架三件套的使用。 Go 框架三件套通常指的是 GORM、Kitex 和 Hertz,它们分别是 Go 语言中数

    2024年02月10日
    浏览(26)
  • 【字节跳动青训营】后端笔记整理-2 | Go实践记录:猜谜游戏,在线词典,Socks5代理服务器

    **本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金:🔗Go实践记录:猜谜游戏,在线词典,Socks5代理服务器 | 青训营 我的go开发环境: *本地IDE:GoLand 2023.1.2 *go:1.20.6 猜数字游戏也算是入门一门编程语言必写的程

    2024年02月13日
    浏览(35)
  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(40)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(36)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包