随笔分类 -  Golang

摘要:一、引入 在进行并发编程时,有时候会需要定时功能,比如监控某个GO程是否会运行过长时间、定时打印日志等等。 GO标准库中的定时器主要有两种:Timer一次性定时器、Ticker周期性定时器。 Timer计时器使用一次后,就失效了,需要Reset()才能再次生效。而Ticker计时器会一直生效。 二、 阅读全文
posted @ 2023-12-28 22:39 李若盛开 阅读(192) 评论(0) 推荐(0) 编辑
摘要:计数器法:https://gitee.com/lymgoforIT/golang-trick/tree/master/08-count-limit-rate令牌桶算法:https://gitee.com/lymgoforIT/golang-trick/tree/master/09-token-buc 阅读全文
posted @ 2023-12-25 23:37 李若盛开 阅读(169) 评论(0) 推荐(0) 编辑
摘要:1、服务限流 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统, 一旦达到限制速率则可以拒绝服务(定向到错误页或告知资源没有了)、排队或等待(比如秒杀、评论、下单)、降级(返回兜底数据或默认数据,如商品详情页库存默认有货)。 一般开发高并发系统常见的限流有: 限制 阅读全文
posted @ 2023-12-25 22:53 李若盛开 阅读(210) 评论(0) 推荐(0) 编辑
摘要:Go语言是通过自带的CGO工具来支持C语言函数调用,同时可用Go语言导出C动态库接口给其它语言使用。 查看是否开启: window: go env |findstr "CGO" linux: go env |grep "CGO" CGO 环境 使用 CGO 需要一定的环境环境支持,Cgo依赖Gcc工 阅读全文
posted @ 2023-12-24 20:24 李若盛开 阅读(204) 评论(0) 推荐(0) 编辑
摘要:在Go语言中,JWT(JSON Web Token)鉴权可以使用第三方库来实现,比如jwt-go。 库的介绍和使用可见文档:jwt package - github.com/golang-jwt/jwt/v5 - Go Packages JWT鉴权登录 创建JWT令牌 在服务器中,可以使用以下代码创 阅读全文
posted @ 2023-12-23 23:40 李若盛开 阅读(979) 评论(0) 推荐(0) 编辑
摘要:Go是一门静态类型的语言,静态类型也就意味着在使用Go语言编程时,所有的变量、函数参数都需要指定具体的类型,同时在编译阶段编译器也会对指定的数据类型进行校验。这也意味着一个函数的输入参数和返回参数都必须要和具体的类型强相关,不能被不同类型的数据结构所复用。 而泛型就是要解决代码复用和编译期间类型安全 阅读全文
posted @ 2023-12-23 23:06 李若盛开 阅读(43) 评论(0) 推荐(0) 编辑
摘要:在函数中,如果参数是非引用类型(int、string、array、struct等),这样就在函数中就无法修改原内容数据; 如果参数是引用类型(指针、map、slice、chan等),这样就可以修改原内容数据。 是否可以修改原内容数据,和传值、传引用没有必然的关系。在C++中,传引用肯定是可以修改原内 阅读全文
posted @ 2023-12-23 22:01 李若盛开 阅读(380) 评论(0) 推荐(0) 编辑
摘要:保护gin构建的web app不panic的方式,简单来说: 1)主程中的panic本身是会被gin拦截的2)协程中的panic需要手动使用defer和recover进行保护 情景在用gin构建项目,运行web app并上线了之后,或许有一些请求会经过业务,在特定的情况下出发会触发golang中的p 阅读全文
posted @ 2023-12-23 17:39 李若盛开 阅读(406) 评论(0) 推荐(0) 编辑
摘要:gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP2 设计。gRPC 默认使用protocol buffers,这是Google开源的一套成熟的结构数据序列化机制(也可使用其他数据格式如JSON)。 基于go的一种远程过程调用,RPC 框架的目标就是让远程服务调用更加简单、透明 阅读全文
posted @ 2023-12-23 08:38 李若盛开 阅读(428) 评论(0) 推荐(0) 编辑
摘要:切片为什么要做内存优化 Go 语言的切片是一个动态的数据结构,可以方便地对其进行扩容和缩容操作。由于切片的底层实现是通过数组来实现的,因此在使用切片时,需要注意内存分配和释放的开销。这也是为什么需要对切片的内存使用进行优化的原因。 内存分配和释放是非常耗时的操作,因此频繁地对切片进行重新分配和释放会 阅读全文
posted @ 2023-12-19 23:41 李若盛开 阅读(36) 评论(0) 推荐(0) 编辑
摘要:中间件:将这些非业务逻辑代码抽象出来,封装好,提供接口给控制器使用。用到了装饰器模式:将最核心的代码一层层装饰,返回的时候一层层出来。 Next() 源码注释:应该只在中间件内部使用。它执行调用处理程序内部链中的挂起处理程序。 通俗的说,就是中间件放行,当一个中间件代码执行到Next(),会先执行它 阅读全文
posted @ 2023-12-19 18:15 李若盛开 阅读(411) 评论(0) 推荐(1) 编辑
摘要:当涉及到连接不同类型的数据库时,可以用常见的方式去连接对应的数据库,也可以使用接口抽象的方式使代码更具灵活性和可扩展性,更显优雅。 非接口抽象方式: 如果涉及到多种数据库时,同样的代码显得非常臃肿。 package main import "fmt" // 直接定义 MySQL 连接和插入函数 fu 阅读全文
posted @ 2023-12-17 17:49 李若盛开 阅读(56) 评论(0) 推荐(0) 编辑
摘要:1、慎用CreatedAt、UpdatedAt和DeletedAt字段 数据库设计字段时要避开这created_at、updated_at、deleted_at字段,因为被框架本身使用了,建议改为created_time、updated_time和deleted_time。 数据插入时,仅仅插入业务 阅读全文
posted @ 2023-12-15 23:05 李若盛开 阅读(770) 评论(0) 推荐(0) 编辑
摘要:在Web开发中,经常需要将数据存储到数据库中以便进行管理和处理。gosqlite3是一个轻量级的sqlite3驱动,它为Golang提供了快速、稳定的sqlite3支持。 package main import ( "database/sql" "fmt" "log" _ "github.com/m 阅读全文
posted @ 2023-12-13 20:12 李若盛开 阅读(972) 评论(0) 推荐(0) 编辑
摘要:1.函数返回局部指针变量 func Add(x,y int) *int { res := 0 res = x + y return &res } func main() { Add(1,2) } 函数返回局部变量是一个指针变量,该函数执行结束,对应栈帧就会销毁,但是引用返回到函数外部,如果外部解析地 阅读全文
posted @ 2023-12-12 18:23 李若盛开 阅读(110) 评论(0) 推荐(0) 编辑
摘要:一、什么是 Work StealingGo语言的 Work Stealing 机制是一种用于调度协程(Goroutines)的策略,有助于充分利用多核CPU,提高并发性能,降低锁竞争,从而使Go程序更高效地运行 Work Stealing 机制的核心思想:每个操作系统线程(M)都有一个本地任务队列, 阅读全文
posted @ 2023-12-11 18:57 李若盛开 阅读(676) 评论(0) 推荐(0) 编辑
摘要:一 、概念基础1.1三色标记法将对象分为三类把图过程中遇到的对象,按“是否访问过”这个条件标记成以下三种颜色: 1.白色对象(可能死亡):未被回收器访问到的对象。在回收开始阶段,所有对象均为白色,当回收结束后,白色对象均不可达。 2.灰色对象(临时状态):已被回收器访问到的对象,但回收器需要对其中的 阅读全文
posted @ 2023-12-09 16:22 李若盛开 阅读(201) 评论(0) 推荐(0) 编辑
摘要:一、逃逸分析 内存逃逸分析是编译器在编译优化时,用来决定变量应该分配在堆上还是栈上的工具。 了解内存逃逸分析的原理后,就能够理解什么样的变量会被分配在栈上、什么样的变量会被分配在堆上。 当你的程序对性能非常敏感,就可以使用内存逃逸工具的分析,查看哪些变量逃逸到了堆上,哪些没有逃逸。然后调整代码,再次 阅读全文
posted @ 2023-12-08 18:21 李若盛开 阅读(913) 评论(0) 推荐(0) 编辑
摘要:为了让程序员更好地专注于业务代码的实现,Go 语言增加了垃圾回收机制,自动地回收不再使用的内存。Go 语言有两部分内存空间:栈内存和堆内存。 1. 栈内存【栈是一种运算受限的线性表,连续储存,其限制是指只仅允许在表的一端进行插入和删除操作】栈只允许往线性表的一端放入数据,之后在这一端取出数据,按照后 阅读全文
posted @ 2023-12-08 17:35 李若盛开 阅读(296) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示