后端基础-go语言进阶 | 青训营

92 阅读3分钟

一、go语言进阶 1.Go可以冲分发挥多核优势,高效运行。可以说Go语言就是为了并发而生的。它可以满足多线程程序在一个核的CPU上运行,同时也能满足多线程程序在多个核的Cpu上运行。

image.png 2.Go语言运行机制里有一个重要的概念--协程。协程是用户态,轻量级线程,栈KB级别。线程是内核态,线程跑多个协程,栈MB级别。

image.png 3.在Go语言中,Goroutine、Channel和Sync是重要的并发编程概念和工具。它们可以让你更方便地编写并发代码,并帮助处理并行执行、协程间的通信和同步等问题。

(1). Goroutine:
Goroutine 是 Go 语言中轻量级的执行单元。它类似于线程,但是占用的资源更少,并且由 Go 运行时管理。Goroutine 使用关键字 go 来启动,例如:

go myFunction() // 启动一个新的 Goroutine
在函数或方法前面加上 `go` 关键字,就可以将其包装为一个 Goroutine 并在后台异步执行。

(2). Channel:
Channel 是 Goroutine 之间进行通信和同步的机制。它可以想象成一个管道,用于在多个 Goroutine 之间传递数据。通过使用 Channel,可以确保并发操作是安全的,并且可以在 Goroutine 之间进行数据传递和同步。使用关键字 make 来创建一个 Channel,例如:

ch := make(chan int) // 创建一个整型的 Channel
Channel 提供了发送和接收操作,用于在 Goroutine 之间传递数据。发送操作使用 `<-` 运算符将数据发送到 Channel,接收操作使用 `<-` 运算符从 Channel 接收数据,例如:
ch <- 42  // 发送数据到 Channel
value := <-ch  // 从 Channel 接收数据

(3). Sync:
Sync 是 Go 语言提供的用于同步并发操作的包。它包含了一些常用的同步原语,如互斥锁(Mutex)、条件变量(Cond)、原子操作等。通过使用这些同步原语,可以确保 Goroutine 之间的共享数据同步访问,以避免竞态条件(Race Condition)等问题。示例使用 Mutex 来进行互斥锁的同步:

import "sync"
var counter int
var mutex sync.Mutex
func increment() {
    mutex.Lock()   // 加锁
    counter++
    mutex.Unlock() // 解锁
}

互斥锁(Mutex)用于保护临界区代码,确保只有一个 Goroutine 能够访问共享资源。使用UnLock 方法来获取锁,使用 Unlock 方法来释放锁。

通过本次学习,我感受到了go语言在处理并发时提供了一些简洁的工具,同时能更容易的实现协程间的通讯和同步,Go 语言在处理并发时提供了一些简洁而优雅的语法和工具。Goroutine 和 Channel 的使用方式简单明了,使得编写并发代码更加直观和易于理解。同时,标准库中的 Sync 包提供了一些常用的同步原语,可以帮助你处理共享资源的访问控制,使得代码更加可靠和安全。这让我们能够更加得心应手的处理大规模的并发任务。