分类目录归档:Golang

Excel库excelize使用笔记

Excel是Microsoft电子表格软件,目前常用的是xlsx格式(Microsoft Excel 2007 及以上版本创建的电子表格文档)。Go语言操作xlsx格式excel文件,有3个常见的库:
● xlsx [github地址:https://github.com/tealeg/xlsx]
● unioffice [github地址:https://github.com/unidoc/unioffice]
● excelize [github地址: https://github.com/qax-os/excelize]

一句话总结差异:xlsx和excelize只支持xlsx文件读写,unioffice支持office三件套;xlsx比较早,目前已经不维护;excelize提供的API和文档比较易用, 流式读写处理大数据集性能较高,特别活跃;unioffice API不易用
继续阅读

Go并发实践笔记二(进阶用法)

第二部分 进阶用法-并发度控制

在基础用法中,我们很简单的实现了并发处理数据,但是随着数据量增多,隐藏的问题就会浮出水面。
并发操作数据库,随数据增加,goroutine增多,会出现部分routine invalid connection DB, 可能是超过了DB的连接数
并发调用下游API,随数据增加,goroutine增多,会触发下游API限流,导致部分请求失败

这个时候就需要进行并发度控制
继续阅读

Go并发实践笔记一(基础用法)

不得不说Go很方便实现并发处理,这里针对实际工作中用的到并发做个笔记

本文分两篇,这一篇是基本用法,另一篇涉及到并发度控制,参考《Go并发实践笔记二(进阶用法)》

第一部分 基本用法

一、并发任务是隔离的
对一组数据,进行处理,不需要对处理结果进行聚合返回
继续阅读

Go 迭代变量的陷阱

在并发的goroutine中遇到这个问题,还以为是goroutine的问题,或者Go闭包的问题, 一层一层分析下来,才知道是Go本身迭代变量的问题,想起了PHP的foreach陷阱【PHP引用理解之神奇的foreach面试题】,不仅感慨深入掌握一门语言何其不易呀 ​​​

先说结论:Go在循环体中,每次遍历的变量是同一个,指向同样的内存地址,这是语言本身的一个陷阱

问题先行,我们先来看看问题
继续阅读

Gopher China2021 参会笔记

一、背景

6月26、27日,第七届 Gopher China 技术分享大会在北京市朗丽兹西山花园酒店举行。有机会去体验了一次今年国内的Gopher盛会,过去一个多星期了,还是想留下点痕迹,以示纪念
继续阅读

一致哈希Go实现及应用(一致哈希学习笔记三)

一致哈希算法介绍参考本站文章《一致哈希算法理解(一致哈希学习笔记一)》

回顾一致哈希算法步骤:
0、将每一个服务器节点按照ip或者server_name, 通过hash函数(eg: crc32)得到对应的一组hash整数值,这里称做hash_servers,并对得到的整数值按由小到大进行排序。
1、将key也通过上面同一个hash函数计算得到对应hash整数值, 这里称为hash_key。

2、遍历hash_servers,用hash_key与hash_servers中的数逐个比较,当hash_key最后小于hash_servers中的那个数存在时,这个数对应的节点就是这个key所存储的节点,否则存在第一个节点。

一、Go实现
这里主要是一致哈希算法Go的一种实现笔记,PHP的实现参考本站文章《一致哈希PHP实现及应用(一致哈希学习笔记二)
继续阅读

Go大切片并发查找问题笔记

一、问题描述
超长切片,切片元素类型为int,切片中元素乱序,使用多个goroutine查找给定值是否存在,找到目标值后立即结束所有的goroutine的执行

二、解决思路
把slice分成多段,每一段起一个task goroutine进行查找,找到目标值后在全局channel中放一条消息。在main goroutine中用select阻塞读取channel中的消息,读到后调用context包的cancel方法,在所有task goroutine的context Done通道中放一条消息, task goroutine读到消息后退出。
继续阅读