golang
已收录文章:867篇
-
sync.Once通过确保初始化函数只执行一次来实现线程安全的单例。1.使用包级变量保存单例实例;2.通过GetInstance方法调用once.Do进行初始化;3.初始化逻辑仅在首次调用时执行,后续调用直接返回已有实例。应用场景包括配置管理、日志记录器、数据库连接池和缓存服务。注意事项:Do方法仅接受无参函数,避免长时间阻塞,不可复用Once对象,多个初始化步骤需合并到一个函数中。261 收藏
-
Golang的archive/zip库通过手动处理目录结构实现压缩与解压缩功能。压缩时,addFileToZip函数判断是否为目录并设置相应属性,若为目录则添加斜杠并设置权限;非目录文件则使用zip.Deflate算法压缩,并将文件内容写入zip包中。解压缩时,decompressFile函数根据文件信息判断是否为目录,若是则先创建对应目录结构,再将文件内容写入磁盘。此外,该库不支持密码保护,需使用第三方库如github.com/alexmullins/zip实现;性能优化可通过流式处理、调整压缩级别、并380 收藏
-
Go语言中数组和切片的区别在于:1.数组是固定长度的数据结构,其长度是类型的一部分,内存中直接保存元素本身;2.切片是对数组的封装,包含指向底层数组的指针、长度和容量,提供动态扩容能力;3.使用方式上,数组长度不可变,而切片可通过append动态追加元素;4.扩容时切片会创建新数组并复制数据,影响性能需注意预分配容量;5.传参时数组为值拷贝不影响原数据,而切片修改会影响原数组;6.数组适合生命周期短且大小固定的场景,切片更适合动态集合。416 收藏
-
复用Golang公共工具模块并创建内部共享库的解决方案包含以下步骤:1.模块化工具代码,将其封装为独立GoModule,如internal/utils,并按功能拆分为stringutil、timeutil等子包;2.使用Git进行版本控制,采用语义化标签管理版本;3.设计简洁接口,使用godoc编写文档注释;4.在项目中通过goget命令引入依赖,并在go.mod中记录;5.编写单元测试并集成至CI/CD流程。对于模块化策略,小型项目可统一存放,大型项目应按功能拆分以提高维护性但增加复杂度。版本冲突可通过485 收藏
-
优化高并发Golang程序内存占用,需从栈大小调整与资源复用两方面入手。1.初始栈默认为2KB,自动扩容可能导致大量goroutine下内存激增,但手动调小需谨慎以免影响性能,普通开发者不建议修改;2.使用sync.Pool缓存临时对象、复用协程池减少频繁创建销毁;3.避免设计不合理导致的goroutine泛滥,通过context控制生命周期、限流、缓冲channel等手段控制数量。合理控制与资源复用是关键,栈调整属底层操作应慎用。226 收藏
-
解析和构建URL查询参数时应使用net/url标准库以避免常见错误。1.使用url.Parse()解析URL并通过Query()获取参数,注意其返回的是map[string][]string类型,单值可用Get()。2.构建URL时使用url.Values添加参数并调用Encode()自动编码,推荐Add()、Set()和Del()方法管理参数。3.特殊字符处理应依赖QueryEscape()和Unescape()实现安全编码与解码,避免手动替换符号。掌握Parse()、Query()、Values、En135 收藏