随笔分类 - golang
摘要:sync.Once 是 Go 标准库提供的使函数只执行一次的实现。作用与 init 函数类似,但有区别。在某些情况下预先初始化一个变量会增加函数的启动延迟,如果实际执行时可能用不上这个变量,那么初始化就是非必须的。sync.Once很好的解决了这个问题,Once可以在任意的位置调用,并且只会执行一次
阅读全文
摘要:原子操作 原子操作是指在程序运行中不能被中断的操作,原子操作是无锁的常常是由CPU指令直接实现,而锁一般由操作系统的调度器实现,所以原子操作的效率一般更高。 golang中原子操作支持的类型有:int32、int64、uint32、uint64、uintptr、unsafe.Pointer gola
阅读全文
摘要:起初是因为要去拉取一些第三方的数据,而第三方的API接口都有限流措施。比如6000/分钟,500/分钟。想着拉取数据就用多个协程的方式。但是容易超频,所以想着写一个限流的东东。网上有讲令牌桶类似下面这样:(网上的原理图) 令牌桶原理 有一个桶,桶有容量(cap:桶的容量)。 然后以恒定的速度往桶里加
阅读全文
摘要:go语言在设计上确保了一些安全的属性,限制了程序可能出错的途径。例如严格的类型转换规则。但也使得很多实现的细节无法通过go程序来访问,例如对于聚合类型(如结构体)的内存布局,或者一个函数对应的机器码。 这里我们将讨论unsafe包,它是由编译器实现的,实现了对语言内置特性的访问功能,这些特性一般是不
阅读全文
摘要:我们在设计产品的时候通常都会遇到消息通知的时候,比如用户下单支付成功,比如用户有站内信来可以实时通知。而http是单向的,客户端请求,服务端返回,这次请求就已经结束。而websocket可以保持连接实现长连接,在遇到通知时往往使用websocket来达到服务端主动向客户端发送消息的目的。 我们的目标
阅读全文
摘要:在开发过程中,为了尽早发现代码中的缺陷和不住,我们经常要写单元测试。从而更快速的发现问题并解决问题,单元测试的效率也比传统手测更高很多。golang的单元测试很简单,先看一个例子 单元测试 用来检测一些程序逻辑的正确性。 简单示例 待测函数 package common func Add(a,b i
阅读全文
摘要:应用程序在运行时,总是会出现一些你意想不到的问题,例如:CPU使用率过高,内存不断增大(疑似内存泄露),或者是Goroutine数量不断增加(goroutine泄露)。那么在这些问题出现时如何进行排查呢,这里介绍pprof工具。 pprof是什么 pprof是析性能分析数据的工具,可以生成可视化的文
阅读全文
摘要:Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。 slice基础 切片的结构 slice是一个结构体 参照源码: src/runtime/slice
阅读全文