随笔分类 - Go
摘要:目录1. 线程(OS Thread)发生 OOM2. Goroutine 发生 OOM3. OOM 的典型场景与解决经验4. 实战对比示例总结 在 Go 语言中,线程(内核线程)和 Goroutine(协程)的内存管理机制存在显著差异,因此发生 OOM(Out Of Memory,内存溢出)时的影响
阅读全文
摘要:目录1. _Grunnable(可运行状态)2. _Grunning(运行中状态)3. _Gsyscall(系统调用状态)4. _Gwaiting(等待/阻塞状态)5. _Gdead(终止状态) Go 语言 GMP 模型中的 Goroutine 状态反映了其在调度过程中的不同阶段。以下是各状态的详细
阅读全文
摘要:目录1. gopark:暂停当前Goroutine2. goready:唤醒等待中的Goroutine协同工作机制注意事项示例场景:通道操作总结 在Go语言的运行时系统中,gopark和goready是用于协调Goroutine调度的内部函数。它们通常由运行时系统自动管理,一般开发者不需要直接调用。
阅读全文
摘要:目录1. 基本概念2. 主要用途3. 使用示例示例 1:指针类型转换示例 2:内存操作4. 注意事项5. 总结 unsafe.Pointer 是 Go 语言中的一个特殊类型,用于进行低级别的内存操作。它允许你将任意类型的指针转换为通用的指针类型,并且可以将其转换回其他类型的指针。unsafe.Poi
阅读全文
摘要:目录如何实现一个负载均衡器?负载均衡器的设计思路1. 确定负载均衡算法2. 维护后端服务器列表3. 健康检查4. 会话保持(可选)5. 高可用性实现负载均衡器的关键技术1. 轮询算法2. 加权轮询算法3. 一致性哈希算法4. 健康检查5. 高可用性完整的负载均衡器示例总结 如何实现一个负载均衡器?
阅读全文
摘要:目录如何实现一个长连接服务?1. 建立 TCP 连接2. 维护连接状态3. 处理数据读写4. 实现心跳机制5. 处理连接超时如何处理连接的超时和心跳?1. 设置读写超时2. 实现心跳机制3. 使用 context 控制连接生命周期完整的长连接服务示例总结 如何实现一个长连接服务? 长连接服务是指客户
阅读全文
摘要:目录Golang中的逃逸分析是什么?逃逸分析的示例如何查看逃逸分析的结果如何避免不必要的内存逃逸1. 避免返回局部变量的指针2. 避免在闭包中捕获局部变量3. 避免使用接口类型4. 避免在切片或映射中存储指针5. 减少大对象的分配6. 使用 sync.Pool 复用对象逃逸分析的局限性总结 Gola
阅读全文
摘要:目录Golang中的sync.Pool是什么?sync.Pool 的核心方法sync.Pool 的使用示例sync.Pool 的使用场景1. 频繁创建和销毁临时对象的场景2. 减少 GC 压力3. 高性能场景4. 临时对象的缓存sync.Pool 的注意事项sync.Pool 的底层实现总结 Gol
阅读全文
摘要:目录安装 Fyne创建一个简单的 Fyne 应用程序运行应用程序Fyne 的主要组件布局管理自定义主题打包应用程序总结 Fyne 是一个用于构建跨平台图形用户界面(GUI)应用程序的 Go 语言框架。它简单易用,支持 Windows、macOS、Linux、iOS 和 Android 等平台。Fyn
阅读全文
摘要:目录1. I/O 多路复用2. Go 的 netpoll 实现3. 与 Go 调度器的集成4. 事件循环5. 非阻塞 I/O6. 源码分析总结 Go 语言中的 netpoll 是网络轮询的核心机制,用于高效处理 I/O 事件。其底层原理主要涉及操作系统提供的 I/O 多路复用机制(如 epoll、k
阅读全文
摘要:目录初始化Go Module创建本地包导入本地包处理跨模块的本地包 在Go语言中,导入本地包通常涉及到使用Go Modules来管理依赖关系。以下是详细的步骤和注意事项,帮助你正确地导入本地包: 初始化Go Module 首先,确保你的项目是一个Go module项目。如果你还没有一个go.mod文
阅读全文
摘要:目录反射的核心概念反射的常见操作示例代码1. 获取变量的类型和值2. 通过反射修改变量的值3. 操作结构体4. 动态调用函数反射的注意事项总结 Go 语言中的反射(Reflection)是一种在运行时检查类型信息和操作变量的机制。通过反射,程序可以动态地获取变量的类型、值、结构体字段、方法等信息,甚
阅读全文
摘要:目录1. reflect.TypeOf()2. reflect.ValueOf()3. reflect.Value.Elem()4. reflect.Value.Set()5. reflect.Value.Interface()6. reflect.Value.Kind()7. reflect.Va
阅读全文
摘要:目录reflect.Valuereflect.Value 的作用reflect.Value 的创建reflect.Value 的常用方法1. 获取值的类型2. 获取值的底层类型3. 获取实际值4. 检查值是否有效5. 检查值是否可设置6. 设置值7. 解引用指针8. 操作结构体9. 动态调用函数10
阅读全文
摘要:目录1. 创建Context1.1 context.Background()1.2 context.TODO()2. 派生Context2.1 context.WithCancel()2.2 context.WithTimeout()2.3 context.WithDeadline()2.4 con
阅读全文
摘要:目录关键点:示例代码代码说明:可能的输出:总结: 在 Go 的 select 语句中,如果多个 case 同时满足条件,Go 会随机选择一个执行,而其他满足条件的 case 不会被执行。也就是说,select 语句只会执行一个 case,其余的 case 会被忽略。 关键点: select 的执行机
阅读全文
摘要:目录示例代码代码说明:输出:关键点:注意事项: 在 Go 中,如果从一个已关闭的 channel 读取数据,会立即返回该 channel 元素类型的零值,并且不会阻塞。对于 select 语句来说,如果 c.ExitBuffChan 被关闭了,那么 case <-c.ExitBuffChan 会立即
阅读全文
摘要:目录1. 安装 logrus2. 基本用法输出示例3. 日志级别设置日志级别记录不同级别的日志4. 添加字段输出示例5. 自定义日志格式输出示例6. 使用钩子(Hooks)输出示例7. 日志输出到文件8. 使用日志实例9. 日志轮转安装 lumberjack使用 lumberjack10. 性能优化
阅读全文
摘要:目录1. 接口的本质2. 测试的重点3. 接口的测试场景4. 是否需要为接口编写测试用例?5. 总结 在 Go 语言中,接口本身不需要编写测试用例,因为接口只是一个抽象的定义,它没有具体的实现逻辑。接口的测试重点在于测试实现了该接口的具体类型(即结构体或其他类型)是否正确地实现了接口定义的方法。 以
阅读全文
摘要:目录单元测试可测试接口面向接口 单元测试 一个代码质量和工程质量有保证的项目一定有比较合理的单元测试覆盖率,没有单元测试的项目一定是不合格的或者不重要的,单元测试应该是所有项目都必须有的代码,每一个单元测试都表示一个可能发生的情况,单元测试就是业务逻辑。 可测试 写代码并不是一件多困难的事情,不过想
阅读全文