- 博客(296)
- 收藏
- 关注
原创 深度剖析go语言上下文context 实现原理
不可变性 (Immutable)每次派生返回新 Context(类似函数式编程)树形拓扑 (Tree Structure)取消信号沿树向下广播接口抽象 (Interface)兼容用户自定义实现显式传递 (Explicit)强制作为函数首个参数性能数据参考:在 100 万次Value()3 层 Context 耗时 ≈ 120ms10 层 Context 耗时 ≈ 450ms印证了深层嵌套的性能损耗理解 Context 的底层机制,能避免并发陷阱并编写高性能 Go 代码。
2025-08-14 22:05:42
977
1
原创 综合聊聊golang 上下文context
用途推荐方式控制 goroutine 生命周期WithCancel等传递请求元数据WithValue超时控制取消操作监听Done()并返回释放资源使用。
2025-08-14 18:08:36
941
原创 golang 笔试题及答案
基于goroutine 和channel, goroutine 是轻量级并行执行单元,channel 用于goroutine 之间的通信,这种模型的。3. 编写一个Go 程序,实现一个简单的通道通信,能够实现生产者和消费者模型。1. 编写一个Go 程序,实现一个简单的HTTP 服务器,能够返回当前时间。2. 编写一个Go 程序,实现一个简单的协程池,能够并发执行多个任务。答:go 语言的interface 类型 是空接口,可以存储任何类型。5. 简述Go 语言的 interface 类型的特点和使用方法。
2025-08-14 13:54:07
918
原创 【二叉树】BM24 二叉树的中序遍历
数据范围:树上节点数满足 0≤n≤1000 ,树上每个节点的值满足 −1000≤val≤1000。给定一个二叉树的根节点root,返回它的中序遍历结果。进阶:空间复杂度 O(n) ,时间复杂度 O(n)树中节点数目在范围 [0, 100] 内。树中的节点的值在[-100,100]以内。输入:{1,2,#,#,3}返回值:[2,3,1]输入:{1,#,2}
2025-08-13 22:57:14
409
原创 [二分查找]BM18 二维数组中的查找
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。输入:7, [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]输入:3, [[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]数据范围:矩阵的长宽满足 0≤n,m≤500 , 矩阵中的值满足 0≤val≤109。
2025-08-13 22:30:03
696
原创 【模拟】BM98 螺旋矩阵
从最上面开始遍历,到边的时候就向下遍历,然后向左遍历,最后向上遍历,当一圈遍历结束的时候则进入里圈进行遍历。给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。数据范围:0≤n,m≤10 ,矩阵中任意元素都满足 ∣val∣≤100。要求:空间复杂度 O(nm) ,时间复杂度 O(nm)输入:[[1,2,3],[4,5,6],[7,8,9]]返回值:[1,2,3,6,9,8,7,4,5]
2025-08-13 20:55:20
583
原创 【动态规划】BM69 把数字翻译成字符串
对于普通数字1-9,译码方式只有一种,但是对于11-19,21-26,译码方式有可选择的两种方案,因此我们使用动态规划将两种方案累计。有一种将字母编码成数字的方式:'a'->1, 'b->2', ... , 'z->26'。进阶:空间复杂度 O(n) ,时间复杂度 O(n)说明:2种可能的译码结果(”ab” 或”l”)输入:"31717126241541717"现在给一串数字,返回有多少种可能的译码结果。数据范围:字符串长度满足 0<n≤90。说明:192种可能的译码结果。
2025-08-13 19:02:51
337
原创 【go】详解golang如何实现高效的并发任务?
在实际开发中,理解调度器的运行机制并结合性能优化策略,可以显著提升Go程序的并发能力和资源利用率。模型实现高效的并发任务管理。Go语言的调度器是其并发模型的核心,通过。
2025-08-11 21:54:21
843
原创 一文讲透 golang 互斥锁与读写锁异同及使用场景
sync.Mutex是一把简单的“独占锁”,谁拿到谁用,其他人等着。是一把“智能锁”,区分“读”和“写”。读的时候可以大家一起看(共享),写的时候必须清场独占(独占)。选择的关键在于分析你的共享资源的访问模式:是读多写少,还是写多读少,或是读写均衡?对于读多写少的场景,能显著提升并发读取性能;否则,sync.Mutex通常是更简单、更安全的选择。
2025-08-11 21:29:10
633
原创 golang 中取消逻辑有没有 cancel() 的替代方案?
方法适用场景优点缺点复杂的并发任务链标准化、支持链式取消需要显式调用cancel()通道(Channel)简单的取消逻辑简单直接无法传递到深层嵌套 goroutine原子变量(Atomic)性能敏感的场景高性能代码可读性较低基于时间的取消自动管理取消逻辑仅适用于超时场景error返回值顺序执行的函数调用结构清晰无法用于并发控制sync.Once确保取消逻辑唯一性保证原子性需要手动协调极端错误处理快速中止不适合并发,易导致资源泄漏select多路复用。
2025-08-11 21:03:11
886
原创 golang 正确使用 cancel() 处理错误详细指南
使用创建可取消的 context。在 goroutine 中监听ctx.Done(),响应取消信号。在错误发生时调用cancel(),中止其他任务。使用确保所有 goroutine 退出后再关闭通道。始终使用防止资源泄漏。通过正确使用cancel(),可以实现优雅的并发任务中止,避免资源浪费和程序阻塞。
2025-08-11 20:40:04
352
原创 [场景实战]go 高并发场景下的接口批量查询
本方案通过context和goroutine实现了高效的并发控制和错误处理机制,能够快速响应失败请求并中止不必要的计算,适用于高并发场景下的接口批量查询需求。
2025-08-11 18:29:52
244
原创 golang 可触发panic 的情况汇总
是一种运行时错误处理机制,当程序遇到无法恢复的严重错误时会触发 panic。函数来触发 panic,通常用于标记程序中无法继续执行的错误(如逻辑错误、资源缺失等)。关闭 channel 后,如果再向其发送数据,会触发 panic。当接口类型断言的目标类型与实际类型不匹配时,会触发 panic。当程序运行时内存分配失败或发生堆栈溢出时,会触发 panic。在运行时进行除法操作时,如果除数为 0,会触发 panic。如果接口类型变量调用了未实现的方法,会触发 panic。指针指向的值时会触发 panic。
2025-08-11 15:55:47
585
原创 【channel】go中channel创建条件与策略详解?
的创建方式,可以高效实现协程间的通信与同步,同时避免内存浪费和性能瓶颈。的创建需要满足特定的条件,并遵循一定的内存分配策略。
2025-08-10 22:01:10
667
1
原创 [动态规划]BM64 最小花费爬楼梯
说明:你将从下标为1的台阶开始,支付5 ,向上爬两个台阶,到达楼梯顶部。6.支付 1 ,向上爬一个台阶,到达楼梯顶部。你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。输入:[1,100,1,1,1,90,1,1,80,1]1.支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。2.支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。3.支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。4.支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。5.支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
2025-08-08 21:56:28
679
原创 [动态规划]BM63 跳台阶
如果从第n个台阶进行下台阶,下一步有2种可能,一种走到第n-1个台阶,一种是走到第n-2个台阶。所以f[n] = f[n-1] + f[n-2]. 那么初始条件了,f[0] = f[1] = 1。所以就变成了:f[n] = f[n-1] + f[n-2], 初始值f[0]=1, f[1]=1,目标求f[n] ,看到这是不是有种很熟悉的感觉,这就是求斐波拉契数列。说明:青蛙要跳上两级台阶有两种跳法,分别是:先跳一级,再跳一级或者直接跳两级。要求:时间复杂度:O(n) ,空间复杂度: O(1)
2025-08-08 21:32:37
187
原创 【动态规划】BM62 斐波那契数列
动态规划算法的基本思想是:将待求解的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;说明:根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。我们也可以根据公式倒推,因为F(n)=F(n−1)+F(n−2) ,而F(n−1) 与 F(n−2)又可以作为子问题继续计算,因此可以使用递归。fib(x)=1 (当x=1,2),
2025-08-08 20:38:37
768
原创 【模拟】BM100 设计LRU缓存结构
输入:["set","set","get","set","get","set","get","get","get"],[[1,1],[2,2],[1],[3,3],[2],[4,4],[1],[3],[4]],2。//将(3,3)插入缓存,缓存容量是2,故去掉某尾的key-value,缓存是{"3"=3,"1"=1},set操作返回"null"返回值:["null","null","1","null","-1","null","-1","3","4"]s.set(2,2);s.set(1,1);
2025-08-08 09:47:51
1025
原创 一文讲透Golang 中字符串的不可变性的底层原理
Go 语言通过其类型系统和底层实现确保了字符串的不可变性。这种设计不仅简化了并发编程(因为不需要担心数据竞争问题),还有助于优化性能,比如字符串内部共享相同的字节序列时不会造成额外的内存开销。然而,这也意味着当你需要“修改”字符串时,实际上是创建了一个新的字符串副本。对于需要频繁修改字符串的应用场景,考虑使用或者来提高效率。
2025-08-02 18:01:44
158
原创 分析golang string 是类型安全的吗?
在类型系统层面,string类型是安全的,因为 Go 编译器会防止类型错误,并且string的不可变性避免了许多常见的编程错误。在并发访问方面,string类型本身不提供线程安全保护。若存在多个 goroutine 对同一string进行写操作(实际上是创建新字符串),则不需要担心线程安全问题;但如果涉及到底层共享的可变状态(例如通过指针间接修改共享的字符串数据结构),则需要额外的同步机制来确保线程安全。因此,在考虑string。
2025-08-02 18:00:25
304
原创 Golang 中的 `bytes.Buffer` 和 `strings.Builder` 有什么区别?
在 Go 语言中,和都是用于高效拼接字符串或处理字节流的类型,但它们有一些关键的不同点和最佳使用场景。
2025-08-02 17:53:14
253
原创 golang 中常用的字符串拼接方法总结大全
在 Go 语言中,字符串拼接是常见的操作,但不同方法的性能差异显著。根据具体场景选择合适的方法,可以显著提升 Go 程序的性能和可维护性。
2025-08-02 17:48:02
936
原创 golang中线程安全和数据稳定性是同一个概念吗?
例如,在分布式系统中,数据稳定性可能还意味着即使在网络分区的情况下,系统也能保证一定程度的数据一致性。在单个程序中,它可能指确保数据在任何时候都是完整和正确的,避免出现部分更新或数据损坏的情况。简单来说,线程安全关注的是多线程环境下的数据访问问题,而数据稳定性关注的是数据在整个程序生命周期内的完整性与正确性。(多goroutine)下,对共享资源(如变量、数据结构)的访问能够被正确同步,避免数据竞争(data race)、竞态条件(race condition)等问题。)、通道(channel)等。
2025-08-02 16:51:11
984
原创 golang 线程安全与非线程安全的数据类型?
非线程安全的数据类型在并发访问时可能引发数据竞争,需要外部同步机制(如锁、原子操作)保护。在 Go 语言中,线程安全与非线程安全的数据类型主要取决于其。
2025-08-02 16:43:02
682
原创 综合对比goroutine和线程的核心差异?
通过以上对比可以看出,Goroutine是Go语言对传统线程模型的优化,特别适合现代高并发、分布式场景的开发需求。Go语言的Goroutine与传统操作系统线程在设计理念、实现方式和性能特性上有显著区别。
2025-08-02 16:15:16
615
原创 详解golang的GMP调度模型
(Goroutine-Machine-Processor)是其高并发能力的核心机制,通过轻量级协程(Goroutine)和高效的调度器实现了卓越的并发性能。理解 GMP 模型有助于编写高性能的 Go 程序,尤其是在处理 I/O 密集型任务或大规模并发时,合理利用调度策略和资源分配是关键。,实现了高效、灵活的并发处理能力。Go 的 GMP 调度模型通过。
2025-08-02 16:00:46
1367
原创 一文讲透golang中如何避免类型转换风险?
在 Go 语言中,类型转换是常见的操作,但如果不加注意,可能会引发运行时错误、数据溢出或精度丢失等问题。通过遵循以上实践,可以显著降低 Go 语言中类型转换带来的风险,提高代码的健壮性和可维护性。,禁止隐式转换(如 C/C++ 中的隐式类型提升)。如果自定义类型与基础类型混合使用,可能导致类型不匹配的错误。为常用类型定义别名,增强代码可读性和类型安全性。将字符串转换为数值类型时,必须处理可能的错误。明确语义,避免不同上下文中的类型混淆(如。(错误写法),会触发编译错误,因为。)时,可能导致溢出。
2025-08-02 15:46:05
693
原创 [场景实战]golang channel 在实际项目中的典型应用举例
通过之前的文章,想必大家都已了解了Channel 是 Go 语言并发编程的核心工具,通过合理设计 Channel 的结构和使用方式,可以高效解决多线程协作中的通信、同步和资源管理问题。:多个生产者生成数据,多个消费者处理数据,通过 Channel 实现解耦和同步。:通过关闭 Channel 通知所有监听者退出,实现服务的优雅关闭。:限制并发数量,避免资源耗尽(如数据库连接、HTTP 请求)。:通过 Channel 控制并发请求速率,防止资源过载。:限制 Channel 的使用方向,提高代码安全性。
2025-08-01 23:44:50
285
原创 详解Go 中的接口类型如何工作?
是一种强大的抽象机制,允许开发者定义行为的集合,并通过隐式实现的方式将这些行为赋予具体类型。)以及其工作原理,有助于开发者高效地使用接口解决实际问题,例如多态、解耦和通用容器设计。实现了强大的抽象能力,使得代码更加灵活、可扩展和可维护。理解接口的底层结构(如。接口是一组方法签名的集合,不包含实现细节。在 Go 语言中,接口(
2025-08-01 23:26:40
924
原创 详解golang 内存缓冲池实现原理
Go语言中的共享内存池(sync.Pool)是一种高效的内存管理工具,旨在减少频繁的内存分配和垃圾回收(GC)压力,尤其适用于的复用场景。Go语言的运行时系统采用(G:Goroutine、M:操作系统线程、P:处理器),其中P是处理器(Processor),负责调度Goroutine。sync.Pool的设计与 GMP 模型紧密结合,通过来降低并发竞争,提升性能。local每个sync.Pool实例维护一个local数组,其长度等于当前运行时的 P 数量(即privatesharedshared。
2025-08-01 12:53:31
1009
原创 golang共享内存池及使用场景
Go 中的共享内存池可以通过sync.Pool或自定义逻辑实现,核心目标是减少内存分配和 GC 压力。简单场景:优先使用sync.Pool,快速实现对象复用。复杂场景:自定义内存池,灵活控制内存分配和并发安全。通过合理使用共享内存池,可以显著提升 Go 程序的性能和稳定性,尤其适用于高并发、低延迟的系统设计。
2025-08-01 11:48:40
641
原创 剖析go channel线程安全核心原因
所有对 Channel 的操作(发送、接收、关闭)都会加锁,确保同一时刻只有一个 goroutine 能够修改 Channel 的状态,从而避免数据竞争。是并发编程的核心机制之一,其线程安全性(即多个 goroutine 并发访问时的安全性)由 Go 运行时的底层设计和调度机制共同保障。通过 Channel 的线程安全性,开发者无需手动管理锁或同步原语即可实现并发安全的通信。机制协调 goroutine 之间的同步,确保并发操作的有序性。),确保对共享状态的修改是线程安全的。Channel 通过。
2025-07-30 00:08:01
838
原创 详解go数据类型之值类型和引用类型
通过合理选择值类型和引用类型,可以优化内存使用、提升程序性能,并避免并发场景下的数据竞争问题。它们在内存分配、赋值行为以及函数参数传递时的行为有显著差异。在 Go 语言中,数据类型分为。
2025-07-29 23:49:19
710
1
原创 go数据类型稳定型和非稳定型详解
Go 的垃圾回收机制(GC)自动管理堆上的数据(如切片、映射),避免了内存泄漏和悬空指针问题。Go 的编译器会捕获许多类型错误(如未定义变量、类型不匹配),确保代码在编译阶段尽可能稳定。等)和复合类型(如数组、结构体)在内存布局和行为上是确定的,不会因运行时环境变化而改变。修改字符串会生成新的副本,避免了并发修改时的不一致性问题。通过合理选择数据类型和遵循 Go 的并发与内存管理规范,可以显著提升程序的稳定性。是 32 位,64 位系统上是 64 位),导致跨平台行为不一致。)在并发场景下是稳定的。
2025-07-28 12:52:49
776
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人