获得徽章 1
#青训营 x 字节后端训练营#
观察者模式 (Observer Pattern),定义对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知,依赖对象在收到通知后,可自行调用自身的处理程序,实现想要干的事情,比如更新自己的状态。
评论
#青训营 x 字节后端训练营#
有关go中结构体高级技巧:
嵌套结构体:可以在结构体中嵌套另一个结构体,从而形成一个复合的结构体类型。嵌套结构体可以直接使用内部结构体的字段,也可以通过内部结构体名来访问内部结构体的字段。
指针结构体:结构体变量通常会占用比较大的内存空间,为了节省内存,可以使用指针结构体。指针结构体可以通过&操作符获取结构体变量的地址,并通过*操作符访问结构体变量的值。
展开
评论
init函数! #青训营 x 字节后端训练营#
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 操作,用于读取或写入数据。
展开
评论
#青训营 x 字节后端训练营#
并发是指多个任务交替进行,通过时间片轮转或者调度算法进行切换,从而给用户一种同时执行的感觉。而并行是指多个任务同时进行,利用多核处理器或者分布式系统的计算能力,实现真正的同时执行sync.WaitGroup 是 Go 语言标准库中的一个结构体,用于等待一组 goroutine 完成执行。它的主要作用是等待所有的 goroutine 完成后再继续执行下一步操作,以避免主程序过早退出。sync.WaitGroup 结构体中的 state1 字段包含了一个 counter 计数器,用于记录等待的 goroutine 数量。
展开
评论
#青训营 x 字节后端训练营#
Go 中想要动态调用函数,需要通过反射的方式来实现。而且其应该是对某个类型进行反射,然后获取到其相关的属性。当函数是一个带有参数的方法的时候,那么我们动态调用的时候还需要传递函数参数。只需要将参数放入call函数中就可以正常传递参数。
评论
#青训营 x 字节后端训练营#
接口是一种定义规范,规定了对象应该具有哪些方法,但并不指定这些方法的具体实现。在 Go 语言中,接口是由一组方法签名(方法名、参数类型、返回值类型)定义的。任何实现了这组方法的类型都可以被认为是实现了这个接口。 这种方式使得接口能够描述任意类型的行为,而不用关心其实现细节。
展开
评论
#青训营 x 字节后端训练营#
flag 包是 Go 语言标准库中的一个包,用于解析命令行参数。它提供了一种方便的方式来定义和解析命令行参数,使得开发命令行工具和应用程序更加简单和灵活。

flag 包的主要功能包括:
定义命令行参数的类型和默认值
解析命令行参数,并将其赋值给对应的变量
提供帮助信息和用法说明
展开
评论
#青训营 x 字节后端训练营#
空结构体的大小是 0 字节。这意味着它不占用任何内存空间。但每个类型都有自己的类型信息,可以用于类型检查和转换。因此,即使是空结构体,在类型系统中也有它自己的位置和作用。
评论
切片的特性

元素的有序性
非线程安全
map的特性

元素的无序性
非线程安全
并发场景下的解决方案

互斥锁:可以对非线程安全的数据结构创建临界区,一般用于同步场景;
管道:可以对非线程安全的数据结构进行异步处理
#青训营 x 字节后端训练营#
展开
评论
#青训营 x 字节后端训练营#
爬虫流程概述:
请求数据
解析数据
数据入库
请求数据:在这里我们需要使用golang中的内置包http包向目标地址发起请求,这一步就完成了
解析数据:这里我们需要对请求到的数据进行解析,因为不是整个请求到的数据我们都需要,我们只需要某些具体的关键的数据而已。这一步也叫数据清洗
数据入库:不难理解,这就是将解析好的数据进行入库操作juejin.cn
展开
评论
select 是一种与 switch 非常相似的控制结构,与 switch 不同的是,select 中虽然也有多个 case,但是这些 case 中的表达式都必须与 Channel 的操作有关,也就是 Channel 的读写操作
#青训营 x 字节后端训练营#
评论
Go 语言的所有文件都需要指定其所在包(package),包的类型有两种,一种就是 main 包,使用 package main 导入,另一种是非 main 包,使用 package 包名 导入,在 Go 中使用 package 管理源文件,package 必须在一个文件夹内,而且该文件夹下只能有一个 package。
#青训营 x 字节后端训练营#
展开
评论
goland 如何给我们自动生成各种注释,分别为如下两个方面:
直接 使用插件 Goanno 的方式来进行注释
简单说明一下 Goland 的文件注释 和 Goland 的函数注释

使用 errWriter 或 bufio.Writer 并不是简化错误处理的唯一方法,而且这种方法并不适用于所有情况。
#青训营 x 字节后端训练营#
展开
评论
panic被描述为不可处理的错误。在web服务中就是服务会崩溃。当然,这在生产环境下是不可接受的。那么,如何能够做到发生panic时技能捕获该panic又能让服务继续健康运行呢?

这就是golang中提供的recover函数了。recover函数能够捕获Panic错误并恢复程序的正常运行。
#青训营 x 字节后端训练营#
展开
评论
#青训营 x 字节后端训练营#
我们因不同的目的去关闭服务。有时,关闭服务器的主要目的是用来更新配置。在Golang中,有很多关于优雅关机的帖子。然而,我发现他们并没有提到热重载配置。一般来说,shutdown graceful和hot reload是由信号控制的。这就是我把它们放在一个帖子里的原因。

起初,一个服务器由于各种原因需要关闭,常见的是操作系统的中断,我们希望能优雅地关闭服务器。最后也是最基本的是如果一个应用程序需要更新,只需要更新配置。这种情况总是发生。那个时候,如果你不需要重启服务器,那将是非常惊人的。你只需要更新你的配置,然后发送一个信号。之后,服务器将热重新加载,你的新配置就会工作。
展开
评论
下一页