随笔分类 - Golang
摘要:一、概念 Go标准库提供了Cond原语,sync.Cond(条件变量)是一个用于在多个goroutine之间进行同步和通信的重要工具,可以让 Goroutine 在满足特定条件时被阻塞和唤醒。 条件变量的作用并不保证在同一时刻仅有一个协程(线程)访问某个共享的数据资源,而是在对应的共享数据的状态发生
阅读全文
摘要:WaitGroup的介绍 WaitGroup就是package sync用来做任务编排的一个并发原语,这个要解决的就是并发-等待的问题:现有一个goroutine A在检查点(chaeckpoint)等待一组goroutine全部完成,如果在执行任务的这些goroutine还没有全部完成,那么gor
阅读全文
摘要:一、什么是可重入锁 var mu sync.Mutex func main() { mu.Lock() mu.Lock() } 这段 Go 程序会阻塞吗?不会,会报以下错误: fatal error: all goroutines are asleep - deadlock! Go 显然是不支持可重
阅读全文
摘要:为什么要做优化 互联网公司本质是将用户共通的行为流程进行了集中化管理,通过中心化的信息交换达到效率提升的目的,同时用规模效应降低了数据交换的成本。 用人话来讲,公司希望的是用尽量少的机器成本来赚取尽量多的利润。利润的提升与业务逻辑本身相关,与技术关系不大。而降低成本则是与业务无关,纯粹的技术话题。这
阅读全文
摘要:代码重构是在不改变外部功能的情况下对现有代码进行改进。它是编程的核心部分之一,不容忽视,否则就无法获得更好的代码版本。代码重构可以增强代码的可读性、可维护性和可扩展性,它还旨在提高性能和开发人员的工作效率。 如何重构 在寻找重构的技术之前,看看如何将代码重构集成到编码过程中。以下建议可用于此目的:
阅读全文
摘要:背景:Golang服务通过docker部署在了线上环境中,但是该服务经常出现内存爆满导致容器自动被kill而退出的现象。因为是线上环境,排查问题会耗时很长,因此先在线上服务的容器上加了个–restart=always的参数,这样可以让容器退出后自动重启,继续进行任务。但在排查内存爆满问题时,线上环境
阅读全文
摘要:sync.Pool 是 sync 包下的一个组件,用来提高对象复用几率,减少gc的压力,减少内存分配,它是并发安全的,常用来存储并复用临时对象。 任何存放区其中的值可以在任何时候被删除而不通知,在高负载下可以动态的扩容,在不活跃时对象池会收缩。 可伸缩的,其大小仅受限于内存的大小,可以被看作是一个存
阅读全文
摘要:一、除数为0 a := 1 b := 0 c := a / b fmt.Println(c) 二、调用接口未实现的方法 三、数组下标越界、字符串越界(运行时错误,对于静态类型语言,数组下标越界是致命错误) 1)数组下标越界 package main import "fmt" func main()
阅读全文
摘要:1.不占空间内存 在 Go 中,可以使用 unsafe.Sizeof 计算出一个数据类型实例需要占用的字节数。 package main import ( "fmt" "unsafe" ) func main() { fmt.Println(unsafe.Sizeof(struct{}{})) }
阅读全文
摘要:一、引入 在进行并发编程时,有时候会需要定时功能,比如监控某个GO程是否会运行过长时间、定时打印日志等等。 GO标准库中的定时器主要有两种:Timer一次性定时器、Ticker周期性定时器。 Timer计时器使用一次后,就失效了,需要Reset()才能再次生效。而Ticker计时器会一直生效。 二、
阅读全文
摘要:计数器法:https://gitee.com/lymgoforIT/golang-trick/tree/master/08-count-limit-rate令牌桶算法:https://gitee.com/lymgoforIT/golang-trick/tree/master/09-token-buc
阅读全文
摘要:1、服务限流 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统, 一旦达到限制速率则可以拒绝服务(定向到错误页或告知资源没有了)、排队或等待(比如秒杀、评论、下单)、降级(返回兜底数据或默认数据,如商品详情页库存默认有货)。 一般开发高并发系统常见的限流有: 限制
阅读全文
摘要:Go语言是通过自带的CGO工具来支持C语言函数调用,同时可用Go语言导出C动态库接口给其它语言使用。 查看是否开启: window: go env |findstr "CGO" linux: go env |grep "CGO" CGO 环境 使用 CGO 需要一定的环境环境支持,Cgo依赖Gcc工
阅读全文
摘要:在Go语言中,JWT(JSON Web Token)鉴权可以使用第三方库来实现,比如jwt-go。 库的介绍和使用可见文档:jwt package - github.com/golang-jwt/jwt/v5 - Go Packages JWT鉴权登录 创建JWT令牌 在服务器中,可以使用以下代码创
阅读全文
摘要:Go是一门静态类型的语言,静态类型也就意味着在使用Go语言编程时,所有的变量、函数参数都需要指定具体的类型,同时在编译阶段编译器也会对指定的数据类型进行校验。这也意味着一个函数的输入参数和返回参数都必须要和具体的类型强相关,不能被不同类型的数据结构所复用。 而泛型就是要解决代码复用和编译期间类型安全
阅读全文
摘要:在函数中,如果参数是非引用类型(int、string、array、struct等),这样就在函数中就无法修改原内容数据; 如果参数是引用类型(指针、map、slice、chan等),这样就可以修改原内容数据。 是否可以修改原内容数据,和传值、传引用没有必然的关系。在C++中,传引用肯定是可以修改原内
阅读全文
摘要:保护gin构建的web app不panic的方式,简单来说: 1)主程中的panic本身是会被gin拦截的2)协程中的panic需要手动使用defer和recover进行保护 情景在用gin构建项目,运行web app并上线了之后,或许有一些请求会经过业务,在特定的情况下出发会触发golang中的p
阅读全文
摘要:gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP2 设计。gRPC 默认使用protocol buffers,这是Google开源的一套成熟的结构数据序列化机制(也可使用其他数据格式如JSON)。 基于go的一种远程过程调用,RPC 框架的目标就是让远程服务调用更加简单、透明
阅读全文
摘要:切片为什么要做内存优化 Go 语言的切片是一个动态的数据结构,可以方便地对其进行扩容和缩容操作。由于切片的底层实现是通过数组来实现的,因此在使用切片时,需要注意内存分配和释放的开销。这也是为什么需要对切片的内存使用进行优化的原因。 内存分配和释放是非常耗时的操作,因此频繁地对切片进行重新分配和释放会
阅读全文
摘要:中间件:将这些非业务逻辑代码抽象出来,封装好,提供接口给控制器使用。用到了装饰器模式:将最核心的代码一层层装饰,返回的时候一层层出来。 Next() 源码注释:应该只在中间件内部使用。它执行调用处理程序内部链中的挂起处理程序。 通俗的说,就是中间件放行,当一个中间件代码执行到Next(),会先执行它
阅读全文
浙公网安备 33010602011771号