【占坑】Go语言进阶:从零实现跳表
基于Go语言实现跳表 占个坑,写个博客记录一下Go语言实现跳表的经过,并对跳表数据结构做更深入的理解。 目前代码已编写完毕,本文代码详见GitHub仓库。
Golang
未读
Golang的这个并发陷阱,让我3分钟内损失了10块
从一个场景说起 最近我正在做一个项目,需要根据多个user_sec_id(即用户唯一标识),批量爬取某视频网站的数据进行分析,因为没有时间成本从零进行爬虫设计,我选择了一个Api服务商提供数据服务。 编程语言方面,我选择直接用Golang进行爬虫,在Api服务器商那边充完钱后,我写了下面逻辑的代码,
Golang
未读
Go语言修炼(十三):Go语言是如何抽象Epoll的?
前言 Epoll,作为Linux下性能极佳的I/O事件通知机制,它突破了传统select/poll机制的种种限制,以更加高效、灵活的方式处理大量的并发连接。 然而,直接使用Epoll进行网络编程往往需要深入理解底层的系统调用与复杂的状态管理,这对于大多数开发者来说是一个不小的挑战。 幸运的是,Go语
Golang
未读
Go语言修炼(十二):高并发下的通信方式Channel
前言 想象一下,在一个繁忙的交通枢纽(业务系统),车辆(Go协程)川流不息,它们需要高效、有序地交换信息以完成各自的使命。 而Channel就像是这些车辆之间的专用通道,既保证了信息的准确传递,又避免了交通拥堵和混乱。通过Channel,Go协程之间可以安全地进行数据交换,无需担心数据竞争和同步问题
Golang
未读
Go语言修炼(十一):Go语言的读写锁是怎么工作的?
前言 在Go语言的并发编程世界中,锁机制是确保数据一致性和线程安全的重要工具。随着应用程序对并发性能要求的不断提升,传统的互斥锁(Mutex)虽然简单有效,但在某些场景下可能会成为性能瓶颈。 为了优化这种情况,Go语言引入了读写锁(sync.RWMutex),它允许多个goroutine同时读取数据
Golang
未读
Go语言修炼(十):Go语言的互斥锁是怎么工作的?
前言 互斥锁,顾名思义,是提供互斥(Mutual Exclusion)能力的锁机制,确保同一时间只有一个goroutine能够访问某个特定的资源或代码段。在Go的标准库中,sync包为我们提供了强大的同步原语,其中sync.Mutex是实现互斥锁功能的关键。掌握sync.Mutex的工作原理和使用方
Golang
未读
Go语言修炼(九):Atomic操作与sema锁
前言 在并发编程中,确保数据的一致性和程序的正确性始终是开发者面临的重大挑战。Go语言以其独特的并发模型——协程(Goroutine)和通道(Channel),为开发者提供了强大的并发编程工具。 然而,仅仅依靠协程和通道还不足以解决所有并发问题,特别是在需要精细控制资源访问和数据一致性的场景下。这时
Golang
未读
Go语言修炼(八):面试必问的GMP调度模型
前言 上一篇文章我们提到:多线程并发的时候会抢夺全局协程队列中的全局锁,造成高并发情况下效率低的问题。G-M-P模型的出现就是为了解决这个问题。 GMP模型是Go语言运行时用于管理并发执行单元(Goroutine)的一套精妙设计。在这个模型中,Goroutine作为轻量级的线程,实现了高效的并发执行
Golang
未读
Go语言修炼(七):协程的本质与线程循环模型
前言 协程是Go语言中一个非常重要的概念,Go语言能够天然支持高并发应用的开发所依赖的就是协程。本文将深入探讨协程的本质以及早期Go语言的线程循环模型,揭开协程的神秘面纱。 协程的概念 首先我们回顾一下《操作系统》这门课的知识。操作系统的处理机管理中,一个非常重要的模块就是进程和线程的管理。 进程:
Golang
未读
Go语言修炼(六):什么是Go语言的内存对齐
前言 在编程的世界里,理解并有效利用内存是每位开发者不可或缺的技能之一。特别是在追求高性能和高效率的现代应用程序开发中,合理的内存管理显得尤为重要。 内存对齐(Memory Alignment)是一个既基础又关键的概念,它直接关系到程序的运行效率和性能。内存对齐是指数据在内存中的存储位置按照某个特定