背景 项目中向插入消息中心服务发送数据,消息字符串中有时间,格式是2006-01-02 15:04:05,于此同时向mysql数据库写数据,其中
背景 项目中使用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
高并发秒杀问题 流程: 先来看秒杀活动流程: 活动入口 客户端秒杀列表页 商品秒杀详情页 点击购买 携带活动ID,商品ID提交服务端 服务端判断活动是否结束
高并发抢红包问题 红包随机值 为了避免抢红包时实时计算效率慢,采用创建红包活动时就提前计算入红包库。 分配红包尽可能平均,假如现剩60块钱,还要分
背景 为了测试环境调试方便和线上环境快速定位问题,客户端请求接口我们要给他们返回一个traceID来标识本次请求。这样拿着traceId来找我
项目中底层函数错误上报不能带上文件名和行号,后面查找很难,有些函数甚至同样的错误信息,比如 func AAA() error { if ...{ return errors.New("file write err") } ... if ...{ return errors.New("file write err") } } pkg/errors 使用实例
概述 HTML5 开始提供的一种浏览器与服务器进行全双工通讯的网络技术,属于应用层协议。它基于 TCP 传输协议,并复用 HTTP 的握手通道。 说到优点,这里的对比参照物
InnoDB中,因为直接操作磁盘会比较慢,所以加了一层内存提提速,叫buffer pool,这里面,放了很多内存页,每一页16KB,有些内存页
获取运行目录和工作目录 二进制hello文件所在文件为/a/b/c/hello 如果在目录/c/d/e目录下执行文件hello /a/b/c/hello f.txt fmt.Println(getCurrentAbPathByExecutable()) // 获取当前执
信号处理 Go 信号通知通过在 Channel 上发送 os.Signal 值来工作。如我们如果使用 Ctrl+C,那么会触发 SIGINT 信号,操作系统会中断该进程的正常流程,并进入相应的信号处
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) 前者没有自动路由器,那么会使
默认的路由器引流 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 里面有个非常重要的
什么是“Trie 树”? Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速
进程 通常我们把一个程序的执行成为一个进程。它是操作系统进行资源分配的最小单位。 进程使用fork(这个一个系统调用)来创建若干的新的进程。前者
栈和堆 在编译时,一切无法确定大小或大小可以改变的数据,最好放到堆上,堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形
使用值为 nil 的 slice、map会发生啥 允许对值为 nil 的 slice 添加元素,但对值为 nil 的 map 添加元素,则会造成运行时 panic。 func main() { var m map[string]int v, ok := m["one"] // nil m
为何需要内存对齐 CPU和内存数据交互的过程。CPU和内存是通过总线进行数据交互的。其中地址总线用来传递CPU需要的数据地址,内存将数据通过数
top命令 经常用来监控linux的系统状况,比如cpu、内存的使用。 第一行: 跟uptime的内容一样。平均负载信息。 第二行: Tasks — 任务(进程)
inode 文件还有元数据部分,例如名字、权限等,这就需要一个结构inode来存放。 什么是 inode 呢?inode 的“i”是 index 的意思,其实就是“索引”,类似图
` 直接使用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':