Daily
更新: 5/29/2025 字数: 0 字 时长: 0 分钟
Daily Plan
#todo
- [ ]
Daily Study
Go中构建堆
#go
模板代码如下,使用了 type sort.IntSlice
:
go
// 大根堆
type hp struct{
sort.IntSlice
}
func (h hp) Less(i, j int) bool{
return h.IntSlice[i] > h.IntSlice[j]
}
func(h *hp) Pop( ) any{
a := h.IntSlice
x := a[a.Len() - 1]
h.IntSlice = a[:a.Len() - 1]
return x
}
func (h *hp) Push(x any){
h.IntSlice = append(h.IntSlice, x.(int))
}
Go中的内存泄露
#go
链接:Memory Leaking Scenarios -Go 101 中文链接:一些可能的内存泄漏场景 -Go语言101
主要分为临时性和永久性两类内存泄露情况
临时性是指该释放的内存没有及时释放,在资源紧张的时候会产生问题,包括:
- 全局变量
string
和slice
在函数中共享内存块,以及slice使用类似s[1:3:3]
赋值时未重置丢弃的切片指针 defer
延迟调用
永久性是指在进程后续的生命周期中,都没有机会回收,包括:
goroutine
在内部预期外的for-loop
或者chan select-case
导致无法退出,造成协程永久堵塞- 没有停止不再使用的
Time.Ticker
- 没有对应的调用
close()
方法,涉及file,socket,http
和第三方客户端的服务,需要显示断开连接
排查和解决方式:
top
查看资源管理器,发现有进程占用的内存异常且持续增加- 查看
/proc/messages
中对应日志,确认是否被操作系统oom killed
- 使用
pprof
来诊断和定位具体泄露的函数 - 使用
ebpf bcc
或者valgrind
工具来排查 - 代码审查
go和c/c++、python的区别
- 设计理念:
- Go:简洁、可维护和高效的并发编程
- C++:强调控制,灵活性和性能,允许开发者直接操纵硬件,可以细粒度化的控制资源和优化。
- Python:动态语言类型,在运行时确定
- 内存管理:
- Go:有自动的垃圾回收机制,使用三色标记法有效的避免内存泄漏问题
- C++:使用 new 和 delete 手动管理内存,使用智能指针避免内存泄漏
- Python:使用引用计数和循环垃圾收集的GC来管理内存
- 并发:
- Go:通过 Goroutine 和 Channel 来实现并发。Goroutine是一个轻量级协程,更容易支持高并发
- C++:没有内置并发编程,通过线程库进行并发操作,需要手动管理
- Python:支持多线程和异步编程,但由于全局解释器锁GIL的存在,导致针对CPU密集型的并发编程的支持有限
- 语言特性:
- Go:语法简洁,用 import引入,没有继承,用接口实现多态,有很多语法糖
- C++:支持多重继承,模板编程,有丰富的面向对象编程
- Python:直观,动态类型语言
- 性能:
- Go:编译型语言,适合高性能,高并发的Web服务、微服务应用,由于GC和编译优化,比C++慢
- C++:编译型语言,速度很快,适合性能极致的应用。
- Python:解释型语言,适合快速开发,速度较慢