这是我参与「第五届青训营」笔记创作活动的第4天,今天我将总结一下Go语言中非常常用的并发编程与错误处理的简单概念。
协程
协程的基本使用
协程的创建
在Go语言中,协程的创建非常的简单
go func() //通过在调用函数前加go关键字即可实现协程的创建
如下面通过匿名函数创建一个向屏幕输出1后休眠10秒的协程
go func() {
fmt.Println(1)
time.Sleep(time.Second * 10)
}()
协程之间的通信(通过通信共享内存)
Go提倡通过通信共享内存而不是通过共享内存实现通信,即通过通道共享,当然也支持通过共享内存(通过锁实现)实现通信
通道的使用
通道类似于一个固定长的(通道可以有缓冲|容量也可以无缓冲|容量)可共享的容器,可以通过for循环range遍历。
通道的创建
channel=make(chan 元素类型) //创建无缓冲通道
channel=make(chan 元素类型, 缓冲大小) //创建有缓冲通道
通道的使用
channel<-待进入通道的变量 //将变量放入通道
协程的执行等待
为了防止协程的执行因为主线程执行完毕而提前结束,需要用到协程的执行等待,通过sync包中的WaitGroup实现,如下例:
var wg sync.WaitGroup
wg.Add(n)
go func() {
defer wg.Done()
...
}()
wg.Wait()
并发安全
通过sync包中Mutex的创建锁
lock sync.Mutex //示例
使用
lock.Lock()
执行语句
lock.Unlock()
错误处理
Go语言的错误处理机制
在Go语言中,Go语言通过内置的错误接口(error)提供了非常简单的错误处理机制。
在Go语言中,我们经常可以看见标准库中函数使用了这样的错误处理机制,比如我们经常用到的Pringf函数:
func Printf(format string, a ...any) (n int, err error) {
return Fprintf(os.Stdout, format, a...)
}
在GitHub中,我们也可以看到许多这样的语句:
if err := function() ; err != nil {
return err
}
这些错误处理方式可以帮助我们非常轻松地构建很棒的错误消息,这些错误消息可以根据定义准确地告诉我们出现了什么问题帮助我们处理错误。
在这里简单的介绍一下错误的定义与使用。
错误的定义
error类型是一个接口类型,其定义如下:
type error interface {
Error() string
}
错误的生成
errors.New("错误描述")