/images/avator.png

xingliuhua

不见其增,日有所长。

项目中gin封装

背景 项目中使用gin框架,一般的注册路由和函数都这样写 func main() { engine := gin.New() engine.GET("/test",testHandler) engine.Run("localhost:8080") } type TestReq struct { Name string } func testHandler(ctx *gin.Context) { // 解析参数 name:=ctx.Query("name") testReq:=TestReq{Name: name} // 检查参数 checkTestReq(testReq) ... // 获取sessi

项目中高并发抢红包

高并发抢红包问题 红包随机值 为了避免抢红包时实时计算效率慢,采用创建红包活动时就提前计算入红包库。 分配红包尽可能平均,假如现剩60块钱,还要分

项目中链路追踪

背景 为了测试环境调试方便和线上环境快速定位问题,客户端请求接口我们要给他们返回一个traceID来标识本次请求。这样拿着traceId来找我

项目中错误处理

项目中底层函数错误上报不能带上文件名和行号,后面查找很难,有些函数甚至同样的错误信息,比如 func AAA() error { if ...{ return errors.New("file write err") } ... if ...{ return errors.New("file write err") } } pkg/errors 使用实例

websocket协议

概述 HTML5 开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于 TCP 传输协议,并复用 HTTP 的握手通道。 说到优点,这里的对比参照物

mysql慢查询分析

InnoDB中,因为直接操作磁盘会比较慢,所以加了一层内存提提速,叫buffer pool,这里面,放了很多内存页,每一页16KB,有些内存页

go运行目录

获取运行目录和工作目录 二进制hello文件所在文件为/a/b/c/hello 如果在目录/c/d/e目录下执行文件hello /a/b/c/hello f.txt fmt.Println(getCurrentAbPathByExecutable()) // 获取当前执

go 平滑重启endless方案

信号处理 Go 信号通知通过在 Channel 上发送 os.Signal 值来工作。如我们如果使用 Ctrl+C,那么会触发 SIGINT 信号,操作系统会中断该进程的正常流程,并进入相应的信号处

gin-http流程

go http流程 go中使用web非常简单,因为api封装很完美,一般我们会写下面代码: http.Handle("/",handler) http.HandleFunc("/user",HandlerFunc) http.ListenAndServe(":8080",nil) 还有下面的: mux := http.ServeMux{} mux.Handle("",handler) http.ListenAndServe("",&mux) 前者没有自动路由器,那么会使

gin-http请求流入gin

默认的路由器引流 func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("Hello World")) }) if err := http.ListenAndServe(":8000", nil); err != nil { fmt.Println("start http server fail:", err) } } 例子中 http.HandleFunc 通过看源码,可以看到 URI “/” 被注册到了 DefaultServeMux 上。 net/http 里面有个非常重要的

gin-前缀树

什么是“Trie 树”? Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速

golang进程线程协程

进程 通常我们把一个程序的执行成为一个进程。它是操作系统进行资源分配的最小单位。 进程使用fork(这个一个系统调用)来创建若干的新的进程。前者

golang内存逃逸

栈和堆 在编译时,一切无法确定大小或大小可以改变的数据,最好放到堆上,堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形

golang语法问题

使用值为 nil 的 slice、map会发生啥 允许对值为 nil 的 slice 添加元素,但对值为 nil 的 map 添加元素,则会造成运行时 panic。 func main() { var m map[string]int v, ok := m["one"] // nil m

趣谈linux笔记

top命令 经常用来监控linux的系统状况,比如cpu、内存的使用。 第一行: 跟uptime的内容一样。平均负载信息。 第二行: Tasks — 任务(进程)

linux软连接和硬连接

inode 文件还有元数据部分,例如名字、权限等,这就需要一个结构inode来存放。 什么是 inode 呢?inode 的“i”是 index 的意思,其实就是“索引”,类似图

golang 引用私有仓库

` 直接使用go get 直接使用go get …添加私有仓库依赖时,会出现以下错误: get "gitlab.com/xxx": found meta tag get.metaImport{Prefix:"gitlab.com/xxx", VCS:"git", RepoRoot:"https://gitlab.com/xxx.git"} at //gitlab.com/xxx?go-get=1 go get gitlab.com/xxx: git ls-remote -q https://gitlab.com/xxx.git in /Users/sulin/go/pkg/mod/cache/vcs/91fae55e78195f3139c4f56af15f9b47ba7aa6ca0fa761efbd5b6e2b16d5159d: exit status 128: fatal: could not read Username for 'https://gitlab.com':