获得徽章 1
赞了这篇文章
init函数! #青训营 x 字节后端训练营#
Go语言提供了先于main函数执行的init函数,初始化每个包后会自动执行init函数,每个包中可以有多个init函数,每个包中的源文件中也可以有多个init函数,加载顺序如下:
从当前包开始,如果当前包包含多个依赖包,则先初始化依赖包,层层递归初始化各个包,在每一个包中,按照源文件的字典序从前往后执行,每一个源文件中,优先初始化常量、变量,最后初始化init函数,当出现多个init函数时,则按照顺序从前往后依次执行,每一个包完成加载后,递归返回,最后在初始化当前包!
init函数实现了sync.Once,无论包被导入多少次,init函数只会被执行一次,所以使用init可以应用在服务注册、中间件初始化、实现单例模式等等
Go语言提供了先于main函数执行的init函数,初始化每个包后会自动执行init函数,每个包中可以有多个init函数,每个包中的源文件中也可以有多个init函数,加载顺序如下:
从当前包开始,如果当前包包含多个依赖包,则先初始化依赖包,层层递归初始化各个包,在每一个包中,按照源文件的字典序从前往后执行,每一个源文件中,优先初始化常量、变量,最后初始化init函数,当出现多个init函数时,则按照顺序从前往后依次执行,每一个包完成加载后,递归返回,最后在初始化当前包!
init函数实现了sync.Once,无论包被导入多少次,init函数只会被执行一次,所以使用init可以应用在服务注册、中间件初始化、实现单例模式等等
展开
评论
点赞
#青训营 x 字节后端训练营#
→select 是 Go 语言中的一种控制结构,用于在多个通信操作中选择一个可执行的操作。它可以协调多个 channel 的读写操作,使得我们能够在多个 channel 中进行非阻塞的数据传输、同步和控制。Go 语言中的 select 语句是一种用于多路复用通道的机制,它允许在多个通道上等待并处理消息。相比于简单地使用 for 循环遍历通道,使用 select 语句能够更加高效地管理多个通道。
→select 语句的使用场景:
1.等待多个通道的消息(多路复用)
当我们需要等待多个通道的消息时,使用 select 语句可以非常方便地等待这些通道中的任意一个通道有消息到达,从而避免了使用多个goroutine进行同步和等待。
2.超时等待通道消息
当我们需要在一段时间内等待某个通道有消息到达时,使用 select 语句可以与 time 包结合使用实现定时等待。
3.在通道上进行非阻塞读写
在使用通道进行读写时,如果通道没有数据,读操作或写操作将会阻塞。但是使用 select 语句结合 default 分支可以实现非阻塞读写,从而避免了死锁或死循环等问题。
→语法
select {
case <- channel1:
// channel1准备好了
case data := <- channel2:
// channel2准备好了,并且可以读取到数据data
case channel3 <- data:
// channel3准备好了,并且可以往其中写入数据data
default:
// 没有任何channel准备好了
}
其中, <- channel1 表示读取 channel1 的数据,data <- channel2 表示用 data 去接收数据;channel3 <- data 表示往 channel3 中写入数据。
→select 的语法形式类似于 switch,但是它只能用于 channel 操作。在 select 语句中,我们可以定义多个 case,每个 case 都是一个 channel 操作,用于读取或写入数据。
→select 是 Go 语言中的一种控制结构,用于在多个通信操作中选择一个可执行的操作。它可以协调多个 channel 的读写操作,使得我们能够在多个 channel 中进行非阻塞的数据传输、同步和控制。Go 语言中的 select 语句是一种用于多路复用通道的机制,它允许在多个通道上等待并处理消息。相比于简单地使用 for 循环遍历通道,使用 select 语句能够更加高效地管理多个通道。
→select 语句的使用场景:
1.等待多个通道的消息(多路复用)
当我们需要等待多个通道的消息时,使用 select 语句可以非常方便地等待这些通道中的任意一个通道有消息到达,从而避免了使用多个goroutine进行同步和等待。
2.超时等待通道消息
当我们需要在一段时间内等待某个通道有消息到达时,使用 select 语句可以与 time 包结合使用实现定时等待。
3.在通道上进行非阻塞读写
在使用通道进行读写时,如果通道没有数据,读操作或写操作将会阻塞。但是使用 select 语句结合 default 分支可以实现非阻塞读写,从而避免了死锁或死循环等问题。
→语法
select {
case <- channel1:
// channel1准备好了
case data := <- channel2:
// channel2准备好了,并且可以读取到数据data
case channel3 <- data:
// channel3准备好了,并且可以往其中写入数据data
default:
// 没有任何channel准备好了
}
其中, <- channel1 表示读取 channel1 的数据,data <- channel2 表示用 data 去接收数据;channel3 <- data 表示往 channel3 中写入数据。
→select 的语法形式类似于 switch,但是它只能用于 channel 操作。在 select 语句中,我们可以定义多个 case,每个 case 都是一个 channel 操作,用于读取或写入数据。
展开
评论
点赞
#青训营 x 字节后端训练营#
并发是指多个任务交替进行,通过时间片轮转或者调度算法进行切换,从而给用户一种同时执行的感觉。而并行是指多个任务同时进行,利用多核处理器或者分布式系统的计算能力,实现真正的同时执行sync.WaitGroup 是 Go 语言标准库中的一个结构体,用于等待一组 goroutine 完成执行。它的主要作用是等待所有的 goroutine 完成后再继续执行下一步操作,以避免主程序过早退出。sync.WaitGroup 结构体中的 state1 字段包含了一个 counter 计数器,用于记录等待的 goroutine 数量。
并发是指多个任务交替进行,通过时间片轮转或者调度算法进行切换,从而给用户一种同时执行的感觉。而并行是指多个任务同时进行,利用多核处理器或者分布式系统的计算能力,实现真正的同时执行sync.WaitGroup 是 Go 语言标准库中的一个结构体,用于等待一组 goroutine 完成执行。它的主要作用是等待所有的 goroutine 完成后再继续执行下一步操作,以避免主程序过早退出。sync.WaitGroup 结构体中的 state1 字段包含了一个 counter 计数器,用于记录等待的 goroutine 数量。
展开
评论
点赞
赞了这篇文章
赞了这篇文章
赞了这篇文章
#青训营 x 字节后端训练营#
我们因不同的目的去关闭服务。有时,关闭服务器的主要目的是用来更新配置。在Golang中,有很多关于优雅关机的帖子。然而,我发现他们并没有提到热重载配置。一般来说,shutdown graceful和hot reload是由信号控制的。这就是我把它们放在一个帖子里的原因。
起初,一个服务器由于各种原因需要关闭,常见的是操作系统的中断,我们希望能优雅地关闭服务器。最后也是最基本的是如果一个应用程序需要更新,只需要更新配置。这种情况总是发生。那个时候,如果你不需要重启服务器,那将是非常惊人的。你只需要更新你的配置,然后发送一个信号。之后,服务器将热重新加载,你的新配置就会工作。
我们因不同的目的去关闭服务。有时,关闭服务器的主要目的是用来更新配置。在Golang中,有很多关于优雅关机的帖子。然而,我发现他们并没有提到热重载配置。一般来说,shutdown graceful和hot reload是由信号控制的。这就是我把它们放在一个帖子里的原因。
起初,一个服务器由于各种原因需要关闭,常见的是操作系统的中断,我们希望能优雅地关闭服务器。最后也是最基本的是如果一个应用程序需要更新,只需要更新配置。这种情况总是发生。那个时候,如果你不需要重启服务器,那将是非常惊人的。你只需要更新你的配置,然后发送一个信号。之后,服务器将热重新加载,你的新配置就会工作。
展开
评论
点赞