
Golang
文章平均质量分 59
Golang学习
编程之禅
公众号:编程之禅,专注后台开发、CDN、算法、大数据,欢迎学习交流
展开
-
Golang方法的本质及receive类型
go 方法本质原创 2024-05-30 09:12:28 · 823 阅读 · 0 评论 -
Golang中nil channel妙用
改进后的示例程序的最关键变化是在判断c1或c2被关闭后,显式地将c1或c2置为nil。我们知道,对一个nil channel执行获取操作,该操作将被阻塞,因此已经被置为nil的c1或c2的分支将再也不会被select选中执行。对于没有初始化的channel进行读写操作将会发生阻塞。此测试程序目的是依次输出5和7两个数字后退出,但是实际输出结果是在输出5之后,程序输出了许多0后才输出7并退出。但是nil channel并非一无是处,有时候妙用nil channel可以达到事半功倍的效果。原创 2024-05-24 23:22:45 · 263 阅读 · 0 评论 -
Go sync包中锁的知识总结
对于零值的sync.Mutex对象拷贝是安全的,因为相关锁状态都是零值,拷贝相当于创建一个新的零值sync.Mutex对象。锁一旦被使用过(即使已经解锁),也不建议被复制,因为锁对象中保存了其状态、信号量等信息,复制sync.Mutex锁后,对锁的操作结果都是未知的。互斥锁是临界区同步原语的首选,它常被用来对结构体对象的内部状态、缓存等进行保护,是使用最为广泛的临界区同步原语。在并发量较大的情况下,读写锁的写锁性能比互斥锁、读写锁的读锁都差,并且随着并发量增大,其写锁性能会继续下降。原创 2024-05-14 22:25:37 · 540 阅读 · 0 评论 -
Go切片实现原理及高效使用规范
Go切片实现原理及使用技巧原创 2024-05-08 20:32:44 · 373 阅读 · 0 评论 -
Go零值机制总结
Golang零值机制及使用限制原创 2024-05-07 22:52:55 · 260 阅读 · 0 评论 -
Golang正确大文件下载方式,避免OOM
今天在golang http下载一个大文件时,报错OOM,通过堆栈发现时读取文件内容时申请内存超过系统内存大小,导致进程被杀。一、错误实现方式func downloadFile() { file, err := os.OpenFile("xxx.txt", os.O_CREATE|os.O_APPEND|os.O_RDWR, 0666) if err != nil { return } defer func() { _ = file.Close() }() rsp, err原创 2021-06-08 23:48:18 · 6138 阅读 · 0 评论 -
Golang逐行读取gzip文件
一、不安全逐行读取gzip文件gzip.NewReader创建一个gzip文件输入对象bufio.NewReader创建一个带有固定缓冲区大小的文件输入对象func ReadLine(file *os.File) (string, error) { reader, err := gzip.NewReader(file) if err != nil { return "", err } bufReader := bufio.NewReader(reader) line, _, err原创 2021-05-21 00:00:01 · 1568 阅读 · 0 评论 -
Golang判断文件是否存在跨平台方案及实现原理
一、判断文件是否存在Golang判断文件是否存在,跨平台实现方案如下:func Exists(filename string) bool { stat, err := os.Stat(filename) if err != nil && os.IsNotExist(err) { return false } return !stat.IsDir()}测试用例:func TestExists(t *testing.T) { dir := "/Users/cow/原创 2021-05-20 23:30:33 · 570 阅读 · 0 评论