随笔分类 - GO
摘要:new 和 make 的区别总结** 特性 new make 用途 用于所有类型,分配内存并返回指针 用于初始化切片、映射和通道类型,返回已初始化的对象 返回值 返回类型的指针 返回的是切片、映射或通道本身,而不是指针 初始化内容 分配内存并初始化为零值 对切片、映射、通道进行初始化并准备好可以使用
阅读全文
摘要:CAS (Compare-And-Swap) 是一种常用的原子操作,广泛应用于多线程和并发编程中。它允许线程在不加锁的情况下进行安全的值交换。 ABA问题 是 CAS 操作中的一个潜在问题: 1. CAS (Compare-And-Swap) 操作 CAS 是一种原子操作,通常用于实现无锁并发数据结
阅读全文
摘要:Goroutine、线程(Thread) 和 进程(Process) 的对比: 特性 Goroutine 线程(Thread) 进程(Process) 创建和销毁开销 非常轻量,几乎没有开销,创建速度快 较重,操作系统需要为其分配资源(切换到内核) 重,操作系统需要为其分配独立内存空间 内存开销 栈
阅读全文
摘要:https://github.com/lifei6671/interview-go/blob/master/base/go-gpm.md
阅读全文
摘要:在 Go 语言的 switch 语句中,fallthrough 关键字是用来强制执行下一个 case的语句块。它并不是用来多次执行的,而是强制执行一次。 解释: 默认情况下,switch 语句在找到匹配的 case 后,会直接跳出 switch 结构,不会继续执行后面的 case 语句块。 如果你在
阅读全文
摘要:GO语言的内存回收机制依赖于垃圾回收(GC),它通过跟踪程序中变量的引用来决定何时回收内存。 在Go中,返回函数参数或临时变量是安全的,原因如下: 引用计数和垃圾回收: Go的垃圾回收器并不会立即释放内存,而是等待对象不再被任何指针引用时才会回收。当你返回一个参数或临时变量时,Go会检查是否有其他指
阅读全文
摘要:依赖注入目录的作用 在程序中,模块或功能之间经常需要用到其他模块,就像“卧室需要床”一样。直接自己创建这些依赖可能会让代码很难维护,而依赖注入可以帮我们自动把需要的“工具”提供给模块。 不自己造:模块不需要关心依赖的细节,直接“拿来用”。 解耦:减少模块之间的直接依赖,让代码更灵活。 方便维护:所有
阅读全文
摘要:protoc 是 Protocol Buffers(Protobuf) 的编译器工具,用于处理 .proto 文件。这些文件定义了数据结构(消息)和接口服务。protoc 将 .proto 文件编译为不同编程语言(如 Go、Java、Python)的代码,使开发者能够轻松进行序列化和反序列化。 Pr
阅读全文
摘要:什么是 RPC(Remote Procedure Call)? RPC(远程过程调用) 是一种计算机通信协议,它允许程序在不同的计算机上像调用本地函数一样,调用远程服务。开发者无需关注底层通信细节(如网络传输),而是通过调用函数接口完成任务。 通俗解释 可以把 RPC 想象成: 打电话:你拨打远程服
阅读全文
摘要:什么是 sync.Once? sync.Once 是 Go 标准库中的一个结构体,用于确保某些代码只执行一次,无论有多少 goroutine 并发调用。它提供了一个线程安全的机制,保证初始化操作或某些关键代码只执行一次。 通俗解释 可以把 sync.Once 想象成一个保险丝: 第一次触发时,保险丝
阅读全文
摘要:什么是 WaitGroup? WaitGroup 是 Go 的标准库 sync 包中提供的一种并发控制工具,用于等待一组 goroutine 完成工作。它非常适合在主线程需要等待一组 goroutine 全部完成时使用。 通俗解释 可以把 WaitGroup 想象成一个计数器: 启动任务时:给计数器
阅读全文
摘要:在 Go 中,指针方法可以被值类型调用,这归因于 Go 编译器的自动解引用特性。 如果一个方法是为指针类型定义的,而我们使用值类型去调用它,Go 会自动将值的地址传递给方法,使得调用能够正常进行。 例子解析 1. 指针方法的定义 假设我们定义了一个方法绑定在结构体的指针上: type Person
阅读全文
摘要:cancel() 取消的是上下文(context)本身,而不是正在执行的协程。 因此,协程的取消是通过 context 的取消信号来间接实现的。 具体地,协程会在收到 context 的取消信号后自行决定是否退出。 如何使用 cancel() 取消协程? 协程通常会通过检查 context 的状态来
阅读全文
摘要:在 Go 中,context 和 channel 都是并发编程中非常重要的工具,但它们有不同的用途和功能。以下是它们之间的主要区别: 1. 主要用途 context: context 主要用于在多个协程之间传递请求范围的数据、取消信号和超时设置。它通常用于控制和管理协程的生命周期,尤其是在处理跨协程
阅读全文
摘要:什么是 context? context 是 Go 标准库中用来管理任务生命周期和跨 API 数据传递的工具。它的主要应用场景是在并发编程中,尤其是处理像 HTTP 请求这样有超时限制或需要手动取消的任务。 为了更通俗地理解,可以把 context 想象成一个任务的「管理员」,它可以: 通知任务何时
阅读全文
摘要:在 Web 开发中,自定义路由器(即自定义 ServeMux 实例)可以带来更大的灵活性和控制。 1. 需要不同的路由策略 默认的 DefaultServeMux 适合简单的 URL 路由需求,但在一些更复杂的场景下(例如需要动态路由、参数化路径等),自定义路由器或第三方路由库(如 gorilla/
阅读全文
摘要:在 Go 语言中,类型断言用于将接口类型的变量转换为具体类型,以便能够访问其底层值。它在操作空接口(interface{})时尤其有用,因为空接口可以持有任意类型的值。 类型断言的语法 类型断言的基本语法如下: value, ok := interfaceVariable.(TargetType)
阅读全文
摘要:在 Go 语言中,make 是一个内置函数,专门用于分配和初始化 slice(切片)、map(映射) 和 channel(通道) 三种数据类型。 **make 函数不会返回一个指针,而是返回初始化后的数据结构本身的引用**。 make 函数的用途 make 的主要作用是为这些引用类型的数据结构分配内
阅读全文
摘要:在 Go 语言中,Channel 是一种用于在多个 Goroutine 之间传递数据的通信机制。 Channel 提供了类型安全、同步的数据传输方式,使 Goroutine 可以相互通信而无需使用锁。 1. Channel 的定义与声明 在 Go 中,可以使用 make 函数创建 Channel,并
阅读全文
摘要:在 Go 语言中,Goroutine 是一种轻量级的并发执行单元,可以理解为 Go 的“协程”。 它由 Go 运行时管理,用于执行函数或任务。Goroutine 的轻量级和高效并发特性使 Go 能够轻松处理数千甚至数百万个并发任务,适合构建高并发的服务器和网络应用。 Goroutine 的启动 Go
阅读全文