![](https://img-blog.csdnimg.cn/20200725175009551.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Golang
文章平均质量分 52
go常见问题、技巧、总结...
dreamer'~
没有梦想的小孩~
越努力,越幸运! 以现在大多数人的努力程度之低,根本轮不到可以拼天赋...
展开
-
常用功能函数:大数组分片、sql逗号拼接、字符压缩、切换shell工作目录...
// 将大数组分片处理func SplitArr() { taskIds := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} block, yushu, blockCnt := 0, 0, 3 // 分区块数,余数,每个区元素数 if len(taskIds)%blockCnt == 0 { block = len(taskIds) / blockCnt yushu = 0 } else { block = len(taskIds)/blockCnt + .原创 2021-10-15 19:18:31 · 306 阅读 · 1 评论 -
【常见面试题】Golang中,协程数最多可以开多少个?
【常见面试题】Golang中,协程数最多可以开多少个?原创 2024-03-29 17:36:01 · 1188 阅读 · 0 评论 -
Go singleflight 第三方库在防止缓存击穿中的重要作用
Go singleflight 第三方库在防止缓存击穿中的重要作用原创 2024-03-28 17:45:03 · 1064 阅读 · 3 评论 -
Golang http请求忘记调用resp.Body.Close()而导致的协程泄漏问题(含面试常见协程泄漏相关测试题)
Golang http请求忘记调用resp.Body.Close()而导致的协程泄漏问题(含面试常见协程泄漏相关测试题)原创 2023-03-03 23:46:11 · 1291 阅读 · 0 评论 -
Golang Map原理(底层结构、查找/新增/删除、扩缩容)
Golang Map原理(底层结构、查找/新增/删除、扩缩容)原创 2023-03-02 18:20:37 · 2448 阅读 · 2 评论 -
Golang中defer和return的执行顺序 + 相关测试题(面试常考)
Golang中defer和return的执行顺序 + 相关测试题(面试常考)原创 2023-02-09 04:46:14 · 1359 阅读 · 0 评论 -
Golang cgo:如何在Go代码中调用C语言代码?
Golang cgo:如何在Go代码中调用C语言代码?原创 2023-01-12 17:36:07 · 4080 阅读 · 0 评论 -
Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)
Golang sync.Map 原理(两个map实现 读写分离、适用读多写少场景)原创 2022-12-05 17:24:01 · 4894 阅读 · 4 评论 -
Go context 原理(channel广播机制 + mutex线程安全)
Go context 原理(channel广播机制 + mutex线程安全)原创 2022-12-02 19:58:40 · 1199 阅读 · 2 评论 -
Go channel被关闭时的广播机制,以及遍历未关闭channel时会导致死锁阻塞问题
Go channel被close时的广播机制,以及遍历未关闭channel时会导致死锁阻塞问题原创 2022-12-02 19:10:59 · 1347 阅读 · 0 评论 -
Go Gin web框架的路由原理及中间件原理
Go Gin web框架的路由原理及中间件原理原创 2022-11-17 16:21:48 · 2417 阅读 · 0 评论 -
利用bitmap处理海量数据问题:43亿QQ号所占内存大小为什么是512M?40亿个QQ号如何去重?
1. QQ号理论上的范围为:10001 - 43亿(2³²),其类型为 `unsigned int`2. 43亿QQ号所占内存大小,经计算后大约占 **512M** (满足小于1G的要求)3. 40亿QQ号所占内存大小,经计算后大约占 **477M** (满足小于1G的要求)4. bitMap实现方案 及 异或 **^** 等位运算5. 利用 **bitMap** 来处理海量数据问题,内存占用低,满足要求且可以取得不错的效果。包括:排序、中位数、topK、去重 等等...原创 2022-09-09 16:43:59 · 1133 阅读 · 0 评论 -
Go pprof 性能分析工具 - 详细使用图解
Go pprof 性能分析工具 - 详细使用图解原创 2022-09-07 17:02:51 · 7231 阅读 · 0 评论 -
Go可以既是面向对象,也是面向过程的?
Go不是OOP的语言,但是又允许有OOP的编程风格,他的灵活性更倾向于让开发者去考虑该怎么去用它。转载 2022-06-14 19:59:19 · 1742 阅读 · 0 评论 -
常用各种sort排序实现(Go/C++版本)
常用各种sort排序实现原创 2022-05-10 16:38:24 · 541 阅读 · 0 评论 -
利用golang生成.csv文件(需加BOM表头,避免excel打开.csv文件中文乱码)
注意:生成.csv文件时,需写入UTF-8 BOM表头,避免使用excel软件打开.csv文件出现中文乱码import ( "bufio" "fmt" "io/ioutil" "os" "strings")// GenerateCsvFile 通过网络下载原.csv文件,将经过筛选后的行记录(比如去除"空行记录"),导出到一个新的.csv文件func GenerateCsvFile(url string) { fmt.Println("开始导出...") // ...原创 2022-04-26 19:25:59 · 3936 阅读 · 0 评论 -
go map/slice 并发写的线程安全问题
切片的写入和map一样都是非线程安全的,但是map有提供sync.Map{}。切片只能通过 加锁 / channel 的方式来实现线程安全的并发写操作。关于方法二(对于map也同理且适用):可以考虑把数据写入、更新的代码封装到一个 channel 中,有一个专门的协程来单独维护 slice 的数据更新。// 方式一 加锁:func WriteDataToSlice1() { list := make([]int, 0) var mutex sync.Mutex ...原创 2022-03-11 16:37:05 · 1671 阅读 · 1 评论 -
Go Slice 部分场景下可提前分配容量:
在某些情况下,如果提前能预估切片容量,那最好提前在make时就分配好容量,避免后续go底层的再次扩容,在一定程度上能提升代码执行效率。但有时容易写错,示例如下:import ( "fmt")func main() { sli := make([]int, 0, 1025) // sli := make([]int, 1025) // 错误写法:这不是预分配容量cap,而是预分配大小size fmt.Println(sli) return}...原创 2022-03-11 16:15:09 · 535 阅读 · 0 评论 -
GO 利用bufio包(流式操作) - 并发写文件/读文件示例
GO 利用bufio包(流式操作) - 并发读/写文件示例原创 2022-02-18 19:14:28 · 4253 阅读 · 0 评论 -
GO Gin框架的Post/Get请求示例
服务端:post本机请求地址:http://127.0.0.1:8080/postReq get本机请求地址:http://127.0.0.1:8080/getReqpackage mainimport ( "fmt" "net/http" "github.com/gin-gonic/gin")func main() { type PostReqType struct { Id int `json:"id"` Name string `json:"name"`原创 2022-02-18 12:48:41 · 6196 阅读 · 0 评论 -
Go 限制协程数、按顺序打印cat、dog、fish各100次
两个常见的Go测试题:(1) 限制协程个数(2) 按顺序打印cat、dog、fish各100次原创 2021-12-08 15:04:11 · 1514 阅读 · 0 评论 -
Go 通用路由注册,反射实现多Action共享同一路由path
Go 通用路由注册,反射实现多Action共享同一路由path(整个项目一个后端地址)原创 2021-12-06 16:57:40 · 355 阅读 · 0 评论 -
Go实现简易聊天室(群聊)
参考:Go 群聊 ( goroutine ) · 语雀基于websocket的聊天室,可进一步参考:(1)go实现聊天室(WebSocket方式)(2)Golang代码搜集-基于websocket+vue.js的简易聊天室聊天室的组成聊天室分为两个部分,分别是:服务端 客户端然后,一般情况下我们互相聊天使用的都只是客户端而已,服务端只是起到调度的作用。信息发送与接收的流程 假设我们有服务端(S)客户端(C1)客户端(C2)客户端(C3)并且S已经 ......原创 2021-12-03 16:39:27 · 2916 阅读 · 10 评论 -
go map中修改key对应结构体类型value值时,报错 error: Cannot assign to user[key].Name
参考:大佬文章原因:map元素是无法取址的,也就是能取到value=user1[key],但不能修改value。解决:使用指针结构map。gomap底层是"哈希表(数组+链表)",时间复杂度为O(1)根因:go中的map,当通过key获取到value时,这个value是不可寻址的,因为map会进行动态扩容,当进行扩容后,map的value就会进行内存迁移,其地址发生变化,所以无法对这个value进行寻址。因此不能直接修改value。...原创 2021-11-12 17:32:33 · 1760 阅读 · 0 评论 -
利用redis对含有分页参数的API接口做调用次数限制
背景 - 限制接口调用次数:提供内部调用的全量拉取数据接口,针对含有分页参数的接口,对于每个用户的不同"Limit和Offset"组合做限制,避免某个用户大量请求影响后台服务处理其他正常请求。思路:初始时,redisPageCnt = 1 首次调用接口时,Limit=10,Offset=0,calculateCnt = (Limit + Offset) / Limit = 1;redisPageCnt=1 此时 calculateCnt = redisPageCnt 相等,redisPageC原创 2021-08-03 20:06:29 · 504 阅读 · 0 评论 -
Go 正则提取匹配字符串
Go语言中使用正则提取匹配的字符串原创 2021-07-16 12:03:03 · 17777 阅读 · 0 评论 -
Go 通过for循环遍历数组并修改值,注意事项:
package mainimport "fmt"func main() { type User struct { Name string } userArr := []User{ {Name: "ZhangSan"}, {Name: "LiSi"}, } // 通过range获取数组的值 -> 不能修改数组中结构体的值: for _, user := range userArr { user.Name = "WangWu" } for _, userNa.原创 2021-06-12 16:53:43 · 5544 阅读 · 0 评论 -
Go 结构体比较,reflect.DeepEqual比较
https://blog.csdn.net/a765717/article/details/112508290转载 2021-05-21 15:16:29 · 2335 阅读 · 2 评论 -
go 指针在函数传参时的运用:
定义指针时,需要初始化,否则使用时由于变量为nil值,对其操作会报错:func main() { // 函数参数为指针类型: // 传指针1(int -> &num1): var num1 int = 666 fmt.Println("before:", num1) TestPointer(&num1) fmt.Println("after:", num1) // 传指针2(*int -> num2): aaa := 666 var num2 *int原创 2021-05-20 18:07:57 · 166 阅读 · 0 评论 -
Go中可能引发panic的操作(部分):
package mainimport ( "fmt"}func main() { // 1.两个nil的比较: //fmt.Println(nil == nil) // 编译报错:invalid operation: nil == nil (operator == not defined on nil) ==符号对于nil来说是一种未定义的操作 // 2.slice: var slice []int64 = nil fmt.Println(len(slice)).原创 2021-04-26 10:46:32 · 618 阅读 · 0 评论 -
go wkhtmltopdf 后端渲染html页面并转为pdf文件:
1.wkhtmltopdf在linux上服务器上安装:https://blog.csdn.net/xcc_2269861428/article/details/85247225https://www.cnblogs.com/lovedaodao/p/7809706.html(报错如:libXrender.so.1...)2.html/template解析html模板示例:https://www.cnblogs.com/show58/p/12605451.html3.模板语法:htt...原创 2021-04-08 17:48:40 · 2222 阅读 · 0 评论 -
Go Mutex 饥饿模式:
相关概念:原子操作:指那些不能够被打断的操作被称为原子操作,当有一个CPU在访问这块内容地址时,其他CPU就不能访问。互斥锁:挂起(通过休眠来使进程阻塞)自旋锁:指当一个线程在获取锁的时候,如果锁已经被其他线程获取,那么该线程将循环等待,然后不断地判断锁能否够被成功获取,直到拿到锁才会退出循环。获取锁的线程持续活跃,不挂起(不是通过休眠来使进程阻塞),继续占有cpu饥饿问题:一些悲惨的G长时间获取不到锁,导致业务逻辑不能继续完整执行。而当前正在cpu上运行的goroutine可能会更先获取到原创 2021-03-30 13:07:35 · 5012 阅读 · 1 评论 -
何时使用Channel,何时使用Mutex ?
另外还有一篇大佬介绍channel底层结构的文章,含动图:传送门~channel本质上是一个 MessageQueuegolang的核心思想是:不要通过共享内存来通信,我们应该通过通信来共享内存。场景:channel主要适用于有数据流动/传递的通讯场合;mutex则适用于数据稳定的场景。当只需锁定少量共享资源时,使用Mutex非常有用。性能:channel与Mutex相比,Channel的使用成本更高,性能更低。原因如下:(1) channel内部实现包含Mute...原创 2021-03-26 15:34:03 · 998 阅读 · 0 评论 -
Go 格式化输出 %v、%+v、%#v 的区别:
参考:大佬文章1.%v 只输出所有的值2.%+v 先输出字段类型,再输出该字段的值3.%#v 先输出结构体名字值,再输出结构体(字段类型+字段的值)原创 2021-03-23 19:34:22 · 9744 阅读 · 0 评论 -
为什么遍历 Go map 是无序的?原生map为什么是非线程安全的?
参考:大佬文章代码层原因:for range map在开始处理循环逻辑的时候,就做了随机播种,用于决定从哪里开始循环迭代。更具体的话就是根据随机数,选择一个桶位置作为起始点进行遍历迭代。结果:因此每次重新for range map,你见到的结果都是不一样的。那是因为它的起始位置根本就不固定!根本原因:你想问为什么要这么做?当然是官方有意为之,因为官方在 Go 早期的时候,发现很多工程师都较依赖 map 的遍历迭代顺序。但这将会导致可移植性存在问题。因此,改之。也请不要依赖......原创 2021-03-23 19:05:13 · 1599 阅读 · 0 评论 -
Golang 分表查询优化
业务函数(处理分表逻辑)explain分析发现当前unionall12张表会导致建临时表写数据是性能瓶颈。修改实现为先统计各张表的记录数再按照当前页数定位到要查的表进行查询即可。新实现方案在大客户(具有单表十万以上记录)分页offset操作时依赖会超时,需要解决,其根本原因是单表记录数过多,导致offset遍历费时。后续查具体list列表信息时,只需要代入对应的{表名(例如:login_info_202106、limit、offset),分别开启协程去并发查询每张表的数据,最后合并即可~p...原创 2021-02-09 14:31:23 · 885 阅读 · 0 评论 -
Go 利用goroutine实现本地 客户端-服务端 tcp通信(读/写数据):
/* bind: An operation on a socket could not be performed because the system lacked sufficient buffer sp https://blog.csdn.net/xia_xing/article/details/53352658 */package mainimport ( "io" "log" "net" "os" "time")func ConnectServer..原创 2021-02-03 19:20:28 · 450 阅读 · 0 评论 -
比较两个文件的差集
比较两个文件的差集,并导出文件到difference.txt中:1.已存在要比较的两个文件,分别为a.txt和b.txt,要找出两文件的差集(属于a.txt但不属于b.txt): 接口32.最终输出结果并导入difference.txt文件:利用set包,也可以自行通过map实现,实现如下:// 比较两个文件API接口的差集,并导出文件到difference.txt中:func FilterDuplicateData() { // 打开文件 aFile, err := ...原创 2021-01-29 18:28:48 · 634 阅读 · 0 评论 -
Go channel 的一些应用
转载一篇大佬关于channel的讲解文章,受益匪浅~各种channel的用法都有介绍到,由浅入深:传送门:channel 的一些应用转载 2021-01-29 14:07:51 · 218 阅读 · 2 评论 -
Golang中 strconv.Itoa()和string()的使用对比:
工作中有时会因为不严谨和疏忽(也可能是保留了之前写C的习惯),有时会犯一些坑爹的小错误,如int转string时,居然会用强制类型转换去做,导致转换后的结果是奇怪的字符,对比示例如下:/* 1.数值类型和string类型之间的相互转换可能造成值部分丢失;其他的转换仅是类型的转换,不会造成值的改变; 2.string和数字之间转换可使用标准库strconv; 3.x是一个字符串,T是[]byte或 []rune。这种情况下可以用string(): []byte -> strin.原创 2021-01-26 13:30:19 · 1362 阅读 · 0 评论