在 golang 的 flag 中自定义参数类型
Golang 的 flag 包能够帮助我们轻松实现一个命令行程序的参数解析,如: package main import ( "flag" "fmt" ) func main() { debug := flag.Bool("v…
Golang 学习笔记:Golang 的 sync/atomic 原子操作
在并发操作中,原子操作是非常现实的问题,典型的就是多个 CPU 对同一个内存的值进行操作,如 i++,很可能两次 i++,这个 i 只增加了一次,sync/atomi…
Golang 的 strconv 包的使用
strconv 包是 go 中做类型转换的包,可以做各种类型与字符串类型的转换。 布尔值和字符串的转换 使用 FormatBool 将布尔值转化为字符串 true 转化为字…
Golang 反射(Reflect)
先推荐一篇讲reflect讲的不错的文章: https://blog.golang.org/laws-of-reflection 反射可以让我们在运行时检查变量的状态。golang 提供了反射的包 r…
Golang Interface 接口
什么是 interface 关于 interface(接口)这种抽象类型,只需要记住并且理解这一句最关键的话: 一个类型如果拥有一个 interface 需要的所有方法,那…
没有 defer rows.Close() 带来的坑
一篇很棒的剖析源码的blog: GORM 之 for (rows.Next) 提前退出别忘了 Close gorm 中调用 Rows() 函数进行查询的时候,需要获取一个连接。策略是: 如…
Gorm FirstOrCreate 的同时更新一些字段
场景:满足某些 where 条件的某条记录,如果已经存在,则将这条记录的某些字段进行更新,如果不存在,则创建这条记录,同时更新指定的字段 FirstOrCre…
Golang 互斥锁如何实现公平
如果多个 goroutine 都在请求同一个锁,sync.Mutex 是如何实现分配公平的呢?我们可以从 Mutex 的注释中理解: 互斥锁有两种状态:正常状态和饥饿状态…
Golang Scheduler 调度器
Go 的运行时(Runtime)管理着调度、垃圾回收以及 goroutine 的运行环境,本次主要介绍调度器(scheduler)。 为什么需要调度器?主要是为了方便高并…
Golang Memery Model 内存模型
在同一个 Goroutine 中,如果我们有下面的语句: a = 1 b = 3 我们可以保证这几条赋值语句是按顺序执行的。但是,对于另一个 Goroutine 来说,它所观…
Golang 基本数据结构 Slice 与 Map 的底层实现
数组,切片 Go 语言数组在初始化之后大小就无法改变,数组在内存中都是一连串的内存空间。当一个数组变量被赋值或者被传递的时候,实际上会复制整个数…
GoPerfcounter 用户 golang 业务监控
goperfcounter 用于 golang 应用的业务监控。goperfcounter 需要和开源监控系统 Open-Falcon 一起使用。 概述 使用 goperfcounter 进行 golang 应用的…
gookit/goutil 基于 Go 一些常用的工具函数收集 / 实现和整理
Go 一些常用的工具函数收集、实现和整理 arrutil array/slice 相关操作的函数工具包 dump 简单的变量打印工具,打印 slice, map 会自动换行显示每个元…
gookit/filter 基于 Golang 数据转换过滤库
Func Usage Quick usage: str := filter.MustString(23) // "23" intVal, err := filter.Int("20") // int(20) strings := filter.Str2Slice("a,b, c"…