
go语言
文章平均质量分 73
lzl-688
学到很多东西的诀窍,就是不要一下子学很多
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Go语言手动内存对齐的四大场景与实践指南
Go语言通过编译器自动处理内存对齐问题,开发者通常无需关心底层细节。然而,在特定场景下,手动干预内存对齐是避免程序崩溃或数据错乱的必要操作。本文将深入探讨Go中,并提供具体实现方法。原创 2025-03-27 18:11:15 · 541 阅读 · 0 评论 -
Go语言nil原理深度解析:底层实现与比较规则
nilnil是Go语言预声明的标识符,表示引用类型的零值。适用类型:指针、切片、映射、通道、接口、函数等。零值的含义指针:内存地址为0。切片/映射/通道:底层结构的指针为0,且长度/容量等字段为0。接口:动态类型和值均为零值。相等条件同类型nil相等,不同类型nil无法比较。设计目的通过类型系统保证安全性,强制开发者显式处理nil。底层实现依赖零值机制,避免野指针问题。原创 2025-03-27 18:10:28 · 676 阅读 · 0 评论 -
深度解析:TOML、XML、YAML及其他配置/数据格式对比
TOML特点类似INI的语法,支持表格和数组结构。支持注释(单行注释)。语法简洁,适合程序配置文件(如 Go 项目)。示例:[server][database]TOML在简洁性和结构化之间取得平衡,适合现代开发工具链。XML适合需要严格结构化和跨平台兼容的场景。YAML凭借可读性和灵活性成为云原生领域的主流选择。JSON仍是数据交换的黄金标准。根据项目需求(如配置复杂度、可读性、工具链支持)合理选择,可显著提升开发效率和配置文件的维护性。原创 2025-03-25 11:44:17 · 604 阅读 · 0 评论 -
平台与架构:深度解析与开发实践
平台决定操作系统环境架构决定硬件兼容性。开发时需明确目标环境的平台+架构组合,并选择对应的编译参数。掌握交叉编译和依赖管理技巧,可大幅提升多平台部署的效率。扩展阅读Command go。原创 2025-03-22 10:34:58 · 1104 阅读 · 0 评论 -
golang 内存对齐和填充规则
通过将占用较大内存空间的成员放在前面,可以减少编译器为了对齐而插入的填充字节数量,从而使结构体更加紧凑,节省内存。你可以使用和来验证这些结构体的实际大小和对齐方式。原创 2025-03-01 10:08:17 · 457 阅读 · 0 评论 -
Go语言中的信号量:原理与实践指南
信号量是一种同步机制,用于限制同时访问某资源的线程(或goroutine)数量。P操作(获取):计数器减1,若计数器为0则阻塞等待V操作(释放):计数器加1,唤醒等待的线程特性互斥锁信号量并发限制数量1可自定义(N≥1)适用场景严格互斥访问流量控制、资源池信号量为Go并发编程提供了灵活的资源管控能力。无论是简单的通道实现,还是功能更强的,开发者都可以根据具体需求选择合适的方案。合理使用信号量不仅能提升程序稳定性,还能有效避免资源竞争导致的性能瓶颈。扩展阅读Go官方并发指南。原创 2025-02-25 20:14:07 · 1090 阅读 · 0 评论 -
Go 语言内存池 (`sync.Pool`) 深度解析
sync.Pool},New函数:当池中没有可用对象时调用,返回一个新的对象实例。sync.Pool是 Go 语言中非常强大的工具,能够有效减少内存分配和 GC 开销。通过合理的使用和优化,可以在高并发场景下显著提升程序性能,同时保持代码的简洁性和可维护性。理解其内部实现原理,可以帮助我们更好地利用sync.Pool来优化内存管理和性能。并发安全:通过 P 局部缓存和无锁设计,减少锁竞争。GC 敏感:两次 GC 周期内有效,防止内存泄漏。高效复用:快速获取和释放对象,减少内存分配。自动管理。原创 2025-02-24 20:46:13 · 1222 阅读 · 0 评论 -
Go 协程池完整解析(原理+实践+性能分析
【代码】Go 协程池完整解析(原理+实践+性能分析。原创 2025-02-24 20:45:11 · 878 阅读 · 0 评论 -
Go 语言编译的原理
Go 编译器通过一系列精心设计的步骤,将 Go 源代码高效地转换为高质量的机器码。理解编译过程不仅有助于开发者编写更高效的代码,还能更好地调试和优化程序。通过合理利用 Go 的模块管理和编译优化功能,可以显著提升开发效率和程序性能。原创 2025-02-17 17:51:33 · 1245 阅读 · 0 评论 -
Go 模块管理工具 `go mod tidy` 和 `go.sum` 文件详解
是 Go 模块管理工具中的一个重要命令,用于清理和更新go.mod和go.sum文件。它的主要作用是确保依赖项是最新的,并且只包含项目实际需要的依赖。原创 2025-02-17 16:48:22 · 1059 阅读 · 0 评论 -
深入理解 ABA 问题与退让策略:Go 语言实现与优化
ABA 问题是操作中一个经典陷阱。当某个变量的值从A变为B,再变回A时,CAS 操作会误认为值未被修改,从而导致逻辑错误。具体来说,线程读取到A,此时其他线程修改为B,再改回A,当前线程执行 CAS 时认为值未变,导致错误提交。ABA 问题是 CAS 操作中的隐蔽陷阱,通过版本号或解决。退让策略平衡了竞争效率和 CPU 消耗,需根据场景选择合适策略。实际编码中,Go 的包已处理了基础原子性问题,但复杂无锁结构仍需开发者关注这些细节。原创 2025-02-14 10:47:49 · 916 阅读 · 0 评论 -
Go语言的内存分配原理
栈:快速分配和释放,适合短期使用的局部变量。堆:灵活但较慢,适合大对象和长期使用的对象。优化建议:尽量使用栈,减少堆分配,使用对象池重用对象。原创 2025-02-11 20:35:30 · 475 阅读 · 0 评论 -
获取嵌套结构体字段总数
获取嵌套结构体字段总数原创 2022-08-16 19:44:01 · 329 阅读 · 1 评论 -
【go实现】任意类型结构体比较
func main(){ fmt.Println(Equal(1,1))}func isFunction(arg interface{}) bool { if arg == nil { return false } return reflect.TypeOf(arg).Kind() == reflect.Func}func validateEqualArgs(expected, actual interface{}) error { if expected == nil &&a原创 2021-11-20 17:37:28 · 611 阅读 · 0 评论 -
golang 详解协程——errgroup
为什么要有sync.errgroupgo支持并发,一般采用的是 channel 或者 sync.WaitGroup ,来实现各个协程之间的流程控制和消息传递。但是对于开启的成千上万的协程,如果在每个协程内都自行去打印 错误日志的话,会造成日志分散,不好分析。所以我们要实现一种能统一处理各个协程错误的工具什么是 sync.errgroupGo团队在实验仓库中添加了一个名为sync.errgroup的新软件包。 sync.ErrGroup再sync.WaitGroup功能的基础上,增加了错误传递,以及原创 2021-07-06 14:42:46 · 1783 阅读 · 1 评论 -
利用DEBUG调试,查看程序GMP调用情况
利用DEBUG调试,查看程序GMP调用情况先编译go文件go build test.go开启调试信息GODEBUG=schedtrace=1000 ./test.exe1000指的是打印时间间隔调试后,控制台会输出如下内容SCHED 0ms: gomaxprocs=6 idleprocs=5 threads=6 spinningthreads=0 idlethreads=3 runqueue=0 [0 0 0 0 0 0]我们来分析下上面这些内容的含义(不了解GMP模型的绕道).原创 2021-06-08 10:25:40 · 193 阅读 · 0 评论 -
go interface 是否可以比较
go interface 是否可以比较interface 有些情况是可以比较的,但分为几种不同的情况空interface 比较不可直接比较类型空interface 实例比较 不赋值import "fmt"type a interface { //bb() int}type b interface { //bb() int}func main() { var c a var d b fmt.Println(c == d)}空接口类型的实例是可以比较的,结果为t原创 2021-04-12 10:54:35 · 2815 阅读 · 0 评论 -
详解 golang 的 defer (转载收藏)
https://mp.weixin.qq.com/s/FUmoBB8OHNSfy7STR0GsWw转载 2021-03-18 14:46:38 · 73 阅读 · 0 评论 -
go http handler
1、handler 概念handler 是一个 inrerface。下面仅有一个方法 ServeHTTPtype Handler interface { ServeHTTP(ResponseWriter, *Request)}ServeHTTP 一共两个参数第一个参数 ResponseWriter 是用来 写相应的第二个参数是 一个指向 request 结构体的指针。这个request 值得就是我们 的请求。里面包含一些请求的信息只要含有我们这个ServeHTTP方法,就是一个han原创 2021-03-11 15:22:44 · 1054 阅读 · 2 评论 -
golang 反射
1、什么是反射在运行时 动态获取 变量的 类型(type)和 类别(kind)如果是结构体实例,可以获取到结构体的信息通过反射可以修改 变量的值。可以调用关联的方法反射的包 reflect反射的本质是 运行时 的我们主要学习 其中type 和 value 的方法在反射中 , 变量、interface、和 reflect 之间是可以相互转换的2、反射的应用场景序列化和反序列化不知道函数调用哪个函数,可通过反射来确定3、反射的方法3.1 reflect.TypeOffu原创 2021-03-10 13:53:39 · 360 阅读 · 0 评论 -
go 类型断言
1、什么是类型断言由于 interface 是 一般类型,不是具体类型。如果要转成具体类型,就需要使用类型断言直接将 x 的值 赋给 a 是不可以的,编译前检查都过不去断言后可成功赋值,输出结果为 52、带检查的类型断言类型断言有时候会失败,比如断言时传入的类型于 interface 指向的类型不一致,这样会导致程序 panic ,无法正常运行我们需要检查断言是否成功以及结果是否有效func main() { var x interface{} a := 1 x =原创 2021-03-09 15:09:32 · 383 阅读 · 0 评论 -
深入了解golang 的channel
文章目录1、channel 是什么channel的特点2、channel 的数据结构hchan等待队列和发送队列的类型包装 sudog3、channel 分类有缓冲channel无缓冲channel4、channel 的创建4.1 分配 hchan4.2 分配buf4.3 makeChan 源码5、发送数据5.1 对channel加锁5.2 将数据拷贝到 buf5.3 对channel 解锁6、接收数据6.1 先对channel上锁6.2 从 buf 中拷出接收的数据6.3 解锁7、如果发送时,buf 数据原创 2021-03-08 18:25:06 · 1781 阅读 · 0 评论 -
golang 读写锁原理
读写锁 RWMutex1、概念读写锁和互斥锁都是为了防止并发而加的锁读写锁相比互斥锁,就是增加了对读写的控制读写锁 写写之间是互斥的,读写也是互斥的,但是读锁 是可以添加多个的2、RWMutex 代码type RWMutex struct { w Mutex // held if there are pending writers writerSem uint32 // semaphore for writers to wait for completing原创 2021-03-05 15:00:28 · 1388 阅读 · 1 评论 -
golang 互斥锁原理
互斥锁1、互斥锁概念对于同一份资源来说,为了保证 在多个线程或者协程同时访问的时候,保证数据的读取不会出现错误。互斥锁相对于 读写锁而言更加绝对一些,互斥锁不论是读写,加过锁后,都是互斥的,需要等待2、Mutex 数据结构type Mutex struct { state int32 // 互斥锁状态 sema uint32 // 信号量}sema 表示信号量,用来控制 goroutine 的 阻塞休眠和唤醒。协程阻塞时等待该信号量,协程解锁是释放该信号量并唤醒等待信号量的协原创 2021-03-04 17:14:53 · 1403 阅读 · 1 评论 -
golang的后台编译流程
先了解编译相关的基本概念环境变量相关仅列举一些常用的,其他的环境变量可以通过 go env 命令 来查看1、GOROOTgo语言的安装目录,方便我们找到所安装的SDK2、GOPATHgo的工作源码目录,也就是项目代码文件的存放目录。可以写多个值,查找的时候根据顺序进行查找。比如 项目中配置的包的路径一般是相对于项目而言的。比如 imp的包路径 /laozhao/motuo/baoma。对于项目而言,项目在本地磁盘的路径是D:/a/b/laozhao/… ;这时,必须配置GOPAT.原创 2021-03-04 10:30:04 · 531 阅读 · 3 评论 -
搞懂golang make和new的区别
make和new都是用来分配内存的。相比make,new的使用场景很少。面试经常被问,来看看这两个具体什么区别new// The new built-in function allocates memory. The first argument is a type,// not a value, and the value returned is a pointer to a newly// allocated zero value of that type.func new(Type) *.原创 2021-03-03 11:43:21 · 568 阅读 · 3 评论 -
go 逃逸分析
go 逃逸分析看逃逸分析首先要知道清楚堆和栈的概念堆和栈堆存储全局变量、占用内存比较大的局部变量。人为干预的,手动申请、分配和释放堆的内存没有特定的结构和大小,可以根据需要进行调整。堆是进程级别的。开销会比较大,对于go这种带GC的语言来说,也会增加gc压力,同时也容易造成内存碎片。堆分配内存的时候需要先找到一个大小合适的内存块,最后通过垃圾回收进行释放栈存储局部变量、返回值、函数参数这些数据由编译器进行管理,因此栈的分配和回收的速度非常快栈的内存通过命令 PUSH 和 REL原创 2021-03-01 17:41:27 · 249 阅读 · 0 评论 -
玩好go的切片
go的slice ,入门就会遇到,但这个东西大多数人都是停留在简单的使用。一些干了好几年的老程序员都说不明白里面的道道,这里面坑不少。恰巧今天有空,好好整理下,永不踩坑为什么要用切片其他语言大多用的都是数组,在go中,数组的长度是不可变化的,声明后就是固定的,所以go有了切片,长度是可变化的我们平时用的最多的也是切片。什么是切片基本概念slice切片是数组的引用类型,故是引用传递(其实是值传递,下面会细细分析)切片的使用和数组类似切片的长度是可以变化的(动态变化的数组)切片的定义语法.原创 2021-02-26 18:21:57 · 362 阅读 · 3 评论 -
静态类型和动态类型
静态类型和动态类型https://www.jianshu.com/p/bc492fcbf18f编程语言按照类型检查可以分为两大类:静态类型 (Static Typing) 和 动态类型 (Dynamic Typing)。在现在比较流行的这些语言里,静态类型的代表人物有 Java、C/C++、Golang 等,动态类型有 Python、Ruby 等。静态类型语言中,变量具有类型,而且在编译期确定,具有某一类型的变量只能持有相同类型的数据。动态类型语言中,变量没有类型,只有数据有类型,变量可以持有任意类型原创 2020-08-11 21:16:07 · 2213 阅读 · 0 评论 -
golang
golang是啥Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言专门针对多处理器系统应用程序的编程进行了优化,使用Go编译的程序可以媲美C或C++代码的速度,而且更加安全、支持并行进程。Golang优势1.开发速度:Go 语言使用了更加智能的编译器,并简化了解决依赖的算法,最终提供了更快的编译速度。2.并发:Go 语言对并发的支持是这门语言最重要的特性之一。goroutine 很像线程,但是它占用的内存远少于线程,使用它需要的代码原创 2020-08-11 20:42:32 · 126 阅读 · 0 评论 -
理解golang调度
线程模型在细说 Go 的调度模型之前,先来说说一般意义的线程模型。线程模型一般分三种,由用户级线程和 OS 线程的不同对应关系决定的。N:1,即全部用户线程都映射到一个OS线程上,上下文切换成本最低,但无法利用多核资源;1:1 , 一个用户线程对应到一个 OS线程上, 能利用到多核资源,但是上下文切换成本较高,这也是 Java Hotspot VM 的默认实现;M:N,权衡上面两者方案,既能利用多核资源也能尽可能减少上下文切换成本,但是调度算法的实现成本偏高。为什么 Go Scheduler 需要原创 2020-08-11 21:03:52 · 361 阅读 · 0 评论