Skip to content

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

主要分为临时性和永久性两类内存泄露情况

临时性是指该释放的内存没有及时释放,在资源紧张的时候会产生问题,包括:

  • 全局变量stringslice在函数中共享内存块,以及slice使用类似s[1:3:3]赋值时未重置丢弃的切片指针
  • defer延迟调用

永久性是指在进程后续的生命周期中,都没有机会回收,包括:

  • goroutine在内部预期外的for-loop或者chan select-case导致无法退出,造成协程永久堵塞
  • 没有停止不再使用的Time.Ticker
  • 没有对应的调用close()方法,涉及file,socket,http和第三方客户端的服务,需要显示断开连接

排查和解决方式:

  1. top 查看资源管理器,发现有进程占用的内存异常且持续增加
  2. 查看 /proc/messages 中对应日志,确认是否被操作系统 oom killed
  3. 使用 pprof 来诊断和定位具体泄露的函数
  4. 使用 ebpf bcc 或者 valgrind 工具来排查
  5. 代码审查

go和c/c++、python的区别

  1. 设计理念:
    • Go:简洁、可维护和高效的并发编程
    • C++:强调控制,灵活性和性能,允许开发者直接操纵硬件,可以细粒度化的控制资源和优化。
    • Python:动态语言类型,在运行时确定
  2. 内存管理:
    • Go:有自动的垃圾回收机制,使用三色标记法有效的避免内存泄漏问题
    • C++:使用 new 和 delete 手动管理内存,使用智能指针避免内存泄漏
    • Python:使用引用计数和循环垃圾收集的GC来管理内存
  3. 并发:
    • Go:通过 Goroutine 和 Channel 来实现并发。Goroutine是一个轻量级协程,更容易支持高并发
    • C++:没有内置并发编程,通过线程库进行并发操作,需要手动管理
    • Python:支持多线程和异步编程,但由于全局解释器锁GIL的存在,导致针对CPU密集型的并发编程的支持有限
  4. 语言特性:
    • Go:语法简洁,用 import引入,没有继承,用接口实现多态,有很多语法糖
    • C++:支持多重继承,模板编程,有丰富的面向对象编程
    • Python:直观,动态类型语言
  5. 性能:
    • Go:编译型语言,适合高性能,高并发的Web服务、微服务应用,由于GC和编译优化,比C++慢
    • C++:编译型语言,速度很快,适合性能极致的应用。
    • Python:解释型语言,适合快速开发,速度较慢

菜就多练

本站访客数 人次 本站总访问量