Ethan Blog

I am what i am

如何优雅的退出子goroutine

退出子goroutine的方法很多,可以使用全局变量、channel、也可以使用官方提供的context类,下面演示使用官方的context类来优雅的通知子goroutine退出。 代码演示 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 ...

golang踩坑记录

用于记录golang开发过程中遇到的坑和解决方案,不保证解决方案的正确性。 一、上传文件获取的文件MD5值一致 golang上传文件时,获取到的文件MD5值不论什么文件它们的MD5值全部一样。 原代码: 1 2 3 4 5 6 //上传代码跳过 md5hash := md5.New() if _, err := io.Copy(md5hash, dstFile); err != n...

redis排行榜同分数排序问题

在使用redis开发一个排行榜的时候,我们通常使用redis的有序集合(sorted set),时间复杂度为O(M*log(N)),但是在某些分差较小,需要先到达这个分数的用户排在前面,但是如果同分数情况下,可能会出现后到达分数的排在前。网上有很多解决方案,这里介绍一个最优解决方案(以下均为伪代码)。 使用毫秒时间排序 1 2 3 4 5 6 7 8 userA = 10 //...

golang使用Context实现简单的超时机制

Golang可以使用很多方案实现超时机制,比如Channel、TimeAfter、Context,下文使用官方提供的Context包来实现一个简单的超时机制。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 func main() { ...

golang实现简单的woker工作池

使用golang实现简单的worker工作池。 指定worker数量,避免创建过多的Goroutine 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 var workerChan chan int = make(chan int ,4) //指定worker数量 var wg = sync.Wait...

golang截取中文字符串

直接使用切片方式会使得中文字符串乱码,必须先将字符串转成rune类型。 1 2 3 str := "测试字符串" str2 := []rune(str) fmt.Println(string(str2[:4]))

API的RSA+AES秘钥交换

后端各自生成自己的RSA秘钥对(公钥、私钥),然后交换公钥(后端给前端的是正常的明文公钥,前端给后端的是用后端公钥加密后的密文公钥;PS:其实我觉得直接交换两个明文公钥就行了),后端生成AES的明文key,用明文key进行AES加密得到密文数据,用前端的公钥进行RSA加密得到密文key,API交互时并将密文数据与密文key进行传输,前端用自己的私钥进行RAS解密的到明文key,用明文k...

Golang设计模式-单例模式

定义 单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的...

GOLANG设计模式基础和分类

OOP基础包括如下: 类与对象 三大基本特性 五大基本原则 1 、类与对象 在GO中用结构体模拟类似类与对象 2、三个基本特性 1 封装:首字母大小写方式代表公有私有权限 1 继承:使用内嵌的方式,对结构体struct进行组合 1 多态:使用interface来实现 3、五大基本原则 单一功能原则 开闭原则 里式替换原则 ...

区分“并发”与“并行”的概念

并发与并行这两个概念是令人困惑的,但在go语言的编程中是必须要理解的。 1 并发(concurrent) 并发是指两种或两种以上的行为在系统中同时存在,至于这两个行为是否在某一时刻同时“执行”,在并发的概念中并不考虑。 在go语言中,go语句可以开启一个新的goroutine,这就典型的并发。不同的goroutines在程序运行期间可能同时存在着, 至于这些goroutines在某...