二-1go语言管理与依赖

109 阅读5分钟

二-1 go依赖与管理 2-1多线程处理 -打印:println("hello g oroutine"+fmt.Sprint(i)

-从打印例子看 使用 Goroutine 的示例,展示了如何在 Go 语言中同时启动多个并发的执行任务。 func hello(i int) { ... }: 这是一个名为 hello 的函数定义,它接受一个整数参数 i。该函数将在后面的代码中被调用。 println("hello goroutine:" + fmt.Sprint(i)): 这行代码会打印一条包含字符串 "hello goroutine:" 和整数 i 的信息。 func helloGoRoutine() { ... }: 这是一个名为 helloGoRoutine 的函数定义,它不接受任何参数。该函数将在后面的代码中被调用。 for i := 0; i < 5; i++ { ... }: 这是一个循环语句,每次迭代时,变量 i 的值从 0 开始递增,直到达到 5 为止。 !!!go func(j int) { ... }(i): 在每次循环迭代时,使用 go 关键字启动一个匿名的 Goroutine。这个 Goroutine 包含了一个接受 j 整数参数的匿名函数,并将当前的 i 值传递给该函数。 hello(j): 在匿名函数内部,调用了之前定义的 hello 函数,并将参数 j 传递给它。 (i): 这是在匿名函数后面的括号中传递参数 i 的方式。这样做是为了确保在 Goroutine 启动之前,i 的值被正确地传递给匿名函数。 !!!time.Sleep(time.Second): 这行代码会让程序暂停执行一秒钟,以确保所有的 Goroutine 有足够的时间完成它们的任务。 总体来说,这段代码的作用是启动了 5 个并发的 Goroutine,每个 Goroutine 执行一次 hello 函数,并将当前的迭代变量值作为参数传递给它。通过使用 Goroutine,这些函数可以并发地执行,提高了程序的效率。 *总结 协程函数 go func (j int){ \主体任务(用j) }(i)

2-1协程(管道):通过通信实现共享内存(通道) *通过make创建通道 无缓冲通道:同步通道src := make(chan int) 有缓冲通道:快递仓库 dest := make(chan int, 3) *实例 go func() {:启动一个新的 Go 协程。这个协程将在后台执行。 defer close(src):使用延迟函数,当协程结束时关闭通道 src。close(src) 表示关闭通道 src,这将导致往该通道发送数据的操作完成,并通知接收者已经没有更多的数据可接收。 for i := 0; i < 10; i++ {:循环从 0 到 9。 src <- i:将变量 i 的值发送到通道 src。 }:循环结束。 }:协程函数结束。 go func() {:启动另一个新的 Go 协程。这个协程也将在后台执行。 defer close(dest):使用延迟函数,当协程结束时关闭通道 dest。 for i := range src {:对通道 src 进行迭代,从中接收数据并赋值给变量 i,直到通道被关闭。 dest <- i * i:将变量 i 的平方值发送到通道 dest。 }:循环结束。 }:协程函数结束。 for i := range dest {:对通道 dest 进行迭代,从中接收数据并赋值给变量 i,直到通道被关闭。 println(i):打印变量 i 的值。 }:循环结束。 这段代码的执行过程如下: 第一个 Go 协程发送数字 0 到 9 到通道 src。 第二个 Go 协程从 src 接收这些数字,并计算它们的平方后发送到通道 dest。 主协程从 dest 接收数据并将其打印出来,直到 dest 被关闭。 这样,最后会输出数字 0 到 9 的平方数。

2-3加锁Lock import("sync") func addWithLock(lock *sync.Mutex,x *int){ lock.Lock() \主体函数 lock.Unlock() } func mian(){ var lock sync.Mutex \sync.Mutex 是 Go 语言标准库中提供的互斥锁类型,用于控制对共享资源的访问。互斥锁是一种同步机制,它可以确保在任何时刻只有一个 goroutine 可以访问被互斥锁保护的代码段。通过使用互斥锁,我们可以避免多个 goroutine 并发地访问或修改共享资源而导致的数据竞争和不一致问题。 addWithLock(&lock,&x) }

2-4WaitGroup *var xx sync.WaitGroup *例子: import("sync") func hello(i int) func main(){ 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() }

2-4依赖管理 Go 语言中的依赖管理是指在开发过程中,管理和使用外部包(也称为模块或库)的过程。在大型项目中,我们经常需要引用其他人编写的代码,这些代码可以帮助我们更高效地开发应用程序。 Go 语言的依赖管理主要通过 Go Modules(Go 模块)来实现。Go Modules 是 Go 1.11 版本及以后引入的官方依赖管理工具。它允许我们在项目中明确声明和管理所需的外部包,同时提供了版本管理和依赖解析等功能。 使用 Go Modules 进行依赖管理的基本步骤如下: 在项目根目录下初始化 Go Modules:使用命令 go mod init 初始化 Go Modules,并生成一个 go.mod 文件。该文件记录了项目的模块信息和依赖项。 1.导入外部包:使用 import 关键字导入所需的外部包。在代码中使用这些包提供的函数、类型或变量。 2.自动解析依赖:当你在代码中导入新的外部包时,在运行代码之前,Go 会自动解析并下载这些依赖项到你的项目中。Go Modules 会根据 go.mod 文件中列出的依赖项版本信息来确定要下载的特定版本。 3.锁定依赖版本:执行 go mod tidy 命令,可以根据当前代码文件的实际依赖情况来更新 go.mod 文件并锁定依赖项的确切版本。这样可以确保在构建、测试和部署时使用相同的依赖版本。 4.更新依赖项:如果你想升级依赖项到最新的稳定版本,可以运行 go get -u 命令来更新所有的依赖项。