随笔分类 - golang
摘要:[toc] 反射之结构体tag "链接" 1. 通过v.Field(i).Tag 获取结构体字段的field 2. 通过v.Field(i).Tag.Get("id") 获取结构体字段中的特定信息 3. func(tag StructTag)Lookup(key string)(value stri
阅读全文
摘要:Benchtest的简单使用 一个简单的benchtest用例 go // 以BenchmarkXXX类似命名,并传入b testing.B 参数 func BenchmarkLoopSum(b testing.B) { for i := 0; i
阅读全文
摘要:go build 使用tag来实现编译不同的文件 "go tooling workshop 中关于go build的讲解" 可以了解到go bulid的一些用法,这篇文章最后要求实现一个根据go bulid tag功能来编译不同版本的做法,version参数根据tag传进来的值进行编译。下面是一个实
阅读全文
摘要:golang http 服务器的接口梳理 "Golang构建HTTP服务(二) Handler,ServeMux与中间件" Hanlde和HandleFunc以及Handler, HandlerFunc HandleFunc仅接受一个func为参数,相对于简洁些。Handle则需要传入一个带有Ser
阅读全文
摘要:三种迭代方式 "3 ways to iterate in Go" 有如下三种迭代的写法: 回调函数方式迭代 通过Next()方法迭代。参照python 迭代器的概念,自定义Next()方法来迭代 通过channel实现迭代。 假设实现迭代从[2, max],打印出偶数。 chan方式迭代 总结: 1
阅读全文
摘要:捕获Ctrl + C中断 优雅的退出程序 "Gracefully terminate a program in Go" "os/signal" 来捕获系统中断等信号 // Notify方法将signal发送到channel, func Notify(c chan
阅读全文
摘要:假如要设计一个统计的json解析模块,json格式为 代码 我们定义Msg类型为interface{},用来接受任意的类型。接下来试着解析msg中的字段 const input = ` { "type": "sound", "msg": { "description": "dynamite", "a
阅读全文
摘要:Go 使用默认参数的技巧 "Functional Options Pattern in Go" golang中没有函数默认参数的设计,因此需要些特别的技巧来实现。 假如我们需要订购一批电脑,其中电脑配置cpu,gpu,内存支持自定义。 定义自定义参数配置,创建一个默认的电脑配置 创建一个闭包函数,接
阅读全文
摘要:fmt 漫谈 "Go Walkthrough: fmt" fmt常用的格式化字符串 %v 是个通用的占位符。它会自动将变量转换为默认格式的字符串,这在打印字符串或数字等原语时非常有用,而且不需要特定的选项 % v 根据go语法打印。尤其在打印struct和切片时特别直观 结果: %T 打印变量的类型
阅读全文
摘要:IO Streaming "Streaming IO in Go" ,引用此文,略有修改 io.Reader和io.Writer io.Reader接口定义了从传输缓存读取数据 Read方法接受一个[]byte作为读取数据后的接收者,返回读取的字节数n和错误err,当读尽缓存内容时,err为io.E
阅读全文
摘要:go中的切片有两个特性: 底层的数据结构是数组 包括从切片和数组派生出来的切片都是公用一个底层数组的 当往切片append的元素超过容量时,即len(s)
阅读全文
摘要:"How to Gracefully Close Channels " ,这篇博客讲了如何优雅的关闭channel的技巧,好好研读,收获良多。 众所周知,在golang中,关闭或者向已关闭的channel发送数据都会引发panic。 谨遵优雅关闭channel的原则 不要在接受一端关闭channel
阅读全文
摘要:Go语言内置encoding/json包支持JSON序列化和反序列化,有如下转换规则 基本的数据结构映射关系 当有指针出现在数据结构中时,会转换成指针所指的值。 chanel,complex和函数不能转化为有效的JSON文本 JSON序列化时,需要定义一个struct结构,支持json tag来扩展
阅读全文
摘要:go generate命令其实就是用来生成代码用的,一般情况下需要配置其他工具和库一起使用 go官网有个实例: painkiller.go 假设我们现在需要为painkiller.go 中的常量添加String方法,我们可以这样写 如果我们用go generate 来自动化生成代码呢? 在 pain
阅读全文
摘要:使用channel同步 package main import ( "fmt" ) func printNumber(num int, c chan struct{}) { fmt.Println(num) c
阅读全文
摘要:sync.Pool 1. Pool是一个可以分别存取的临时对象的集合。 2. Pool中保存的任何item都可能随时不做通告的释放掉。如果Pool持有该对象的唯一引用,这个item就可能被回收。 3. Pool可以安全的被多个线程同时使用。 4. Pool的目的是缓存申请但未使用的item用于之后的
阅读全文
摘要:Context,是golang用来控制并发流程的库,它能方便的将主控程序的停止信号传递到goroutinue中,从而实现一键中止关联goroutinue的执行,除此之外,它还能将外部变量通过Value的接口传递到goroutinue中。Context是一个接口类型,可以看下面的代码的定义,可以提供一
阅读全文
摘要:sync.WaitGroup,顾名思义,等待一组goroutinue运行完毕。sync.WaitGroup声明后即可使用,它有如下方法: func (wg *WaitGroup) Add(delta int) #不能传入符数,否则引发panic func (wg *WaitGroup) Done()
阅读全文
摘要:golang 通过sync/atomic库来支持cpu和操作系统级别的原子操作。但是对要操作类型有如下要求 int32, int64,uint32, uint64,uintptr,unsafe包中的Pointer。不过,针对unsafe.Pointer类型,该包并未提供进行原子加法操作的函数 syn
阅读全文
摘要:sync.Cond 条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用。 sync.Cond 条件变量用来协调想要访问共享资源的那些线程,当共享资源的状态发生变化的时候,它可以用来通知被互斥锁阻塞的线程 条件变量的初始化离不开互斥锁,并且它的方法也是基于互斥锁的 条件变量有三个方法,等待通知(
阅读全文