实现自定义的 Gin Logger 中间件

gin 的中间件原理解析 在 gin 中,中间件是一系列 gin.HandlerFunc 链,它的函数签名类型和我们业务中写的URL对应的 handler 是一样的,都是gin.HandlerFunc。 gin [阅读全文]
golang 

php-fpm 超时原因分析

背景 线上PHP服务,同一台机器上部有AB两个服务,A接收外部请求后再通过本地nginx请求部署在本地的B服务获取数据,同时也有大量的请求直接 [阅读全文]
debug 

Go 单元测试 gostub 打桩使用方法

golang 单元测试中常用以下 4 个库方便测试代码的编写: gostub 主要用来给变量、函数、过程打桩 但是给函数打桩时,需要做侵入式修改 convey 主要用途是用来组织测试用例 [阅读全文]
golang 

在 Zap 中集成 Sentry 自动上报 Error 事件

在项目中发生了错误时我们都会打印 Error 级别的日志,但是即使有日志采集,在对发生 Error 时的告警通知和信息采集都不一定能快速且完善,目前对日志的告警也只 [阅读全文]
golang 

Zap 源码阅读笔记

zap.Logger 日志Logger结构体,以此调用打印日志内容,定义如下: type Logger struct { core zapcore.Core development bool name string errorOutput zapcore.WriteSyncer addCaller bool addStack zapcore.LevelEnabler callerSkip int } zapcore.Entry 日志主体内容结构体,表示一条具体日志,定义 [阅读全文]
golang 

我和 Dave 有个约会

Start 今天上午参加了 Go 语言项目开发成员 Dave Cheney 的分享。 分享的主题是《High Performance Go: Two tools, three types of profiling in 45 minutes》 分享的内容来自 https://dave.cheney.net/high-performance-go-workshop/gopherchina-2019.html 非常有干货的分享! 两 [阅读全文]
golang 

Go 中通过组织结构体以节省内存

先执行一段示例代码,有一个类似如下的结构体 myStruct: package main import ( "fmt" "reflect" "unsafe" ) type myStruct struct { myBool bool myFloat float64 myInt int32 } func main() { a := myStruct{} fmt.Println(unsafe.Sizeof(a.myBool)) // 1 fmt.Println(unsafe.Sizeof(a.myFloat)) // 8 fmt.Println(unsafe.Sizeof(a.myInt)) // 4 fmt.Println(unsafe.Sizeof(a)) // 24 fmt.Println(reflect.TypeOf(a.myBool).Align()) // 1 [阅读全文]
golang 

自定义 Golang Time 类型字段的 JSON 序列化格式

Golang 中自定义 time.Time 类型的 JSON 序列化格式 Golang 中时间格式定义: const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone RFC850 = [阅读全文]
golang