Golang随笔
文章平均质量分 74
cheems~
业精于勤,荒于嬉;行成于思,毁于随。
展开
-
Golang切片copy踩坑
Golang切片copy踩坑前言错误示范错误原因正常用法前言 在刷题的时候,有时候写dfs,我总喜欢拼凑切片,但是在debug的时候发现切片总是莫名结果会多出很多零,这就引起了我的好奇心,为什么我拼凑切片会出错,错在哪里?错误示范 见下,我的目标是去除原切片下标i的元素,组成新的切片,进行下一次的递归func main() { cnt := []int{1, 2, 3, 4, 5, 6, 7, 8, 9} errDemoDfs(cnt)}func errDemoDfs(cnt [原创 2022-05-23 00:33:14 · 562 阅读 · 0 评论 -
golang-Mock对单元测试的作用
golang单元测试-Mock为什么要Mock什么是Mock做个测试不用Mock使用Mock为什么要Mock 在一个复杂项目中,项目可能依赖于多个组件(DB,Cache,File等)。这些依赖都属于项目中的强依赖,如果没有这些组件,项目是不完整的,或者说某个功能是运行不了的。 单元测试有两个目标,一个是幂等,一个是稳定。 幂等:重复运行一个测试的case,每次的结果都是一样的 稳定:单元测试相互隔离,在任何时间,任何函数,任何环境都能独立的运行 那要实现这个目标,因为我们有这么多依赖,原创 2022-05-10 00:30:10 · 452 阅读 · 0 评论 -
golang在线词典
golang在线词典前言抓包解析成go代码json转go结构体输入看看效果重点前言 实现功能:输入一个英文单词,返回翻译及其英标。 这个项目非常简单,本文的主要目的是记录两个网站(curl语句转换成golang代码,json结构体转go结构体),留着以后直接用。抓包 首先随便去一个翻译网站抓个包,这里我去的是彩云小译,然后随便输入一个单词,去找前端发送给后端的请求。这里copy的内容是:curl 'https://api.interpreter.caiyunai.com/v1/dict原创 2022-05-09 22:11:52 · 623 阅读 · 0 评论 -
gin框架JWT验证实践(原理介绍,代码实践)
gin框架JWT验证实践前言JWT介绍背景tokenJson-Web-Token(JWT)介绍Demo代码分析流程分析框架分析demo演示走入源码入口main:创建token:校验token:前言 作者大二,在网上看各种名词,什么cookie,session,JWT,看了几篇文章后,概念是理解了,但是真正想写一个小demo实践的时候,总是感觉无从下手,所以写本文的目的,意在帮助在与我同阶段的同学,从0到1的去梳理出流程,以提升自己的抽象和分析能力。前置要求:文demo使用了gin和gorm,如果不知原创 2022-05-06 19:04:33 · 867 阅读 · 0 评论 -
gin中间件(Use)不能写在响应函数之后的原因——源码分析
gin中间件不能写在响应函数之后的原因——源码分析前言提出问题分析源码初探----首先观察r.Get函数再探----再次观察r.Use函数梳理流程问题总结前言 这个源码分析没什么意义,仅个人感兴趣进行探究而已提出问题 今天看别人写的gin代码的时候,发现中间件始终都是写在响应函数的上面func main() { r := gin.Default() r.Use(wxf666) r.GET("/", func(c *gin.Context) { fmt.Println("Now in ca原创 2022-05-04 22:38:19 · 1352 阅读 · 0 评论 -
限流算法~
限流算法限流的作用限流的算法固定窗口计数器滑动窗口计数器漏桶令牌桶限流的实现限流的作用 由于对外提供的API接口无法控制调用方的行为,当遇到瞬时流量激增(流量突刺)的情况时,可能会导致接口占用过多的服务器资源,导致其他的请求响应速度降低或超时,又或是服务器承受不住导致宕机。所以限流的作用就是保护服务器,防止流量突刺的情况导致服务崩溃。 限流 (Ratelimiting) 指对应用服务的请求进行限制,例如某一接口的请求限制为每秒一百次, 对超过限制的请求则进行快速失败或丢弃。限流解决的问题:原创 2022-05-04 12:00:13 · 302 阅读 · 0 评论 -
Golang简单实现 分布式缓存+一致性哈希+节点再平衡(gossip + consistent + rebalance)
分布式缓存 + 一致性哈希 + 节点再平衡前言项目介绍使用介绍分析源码REST接口TCP字节流创建新节点加入到集群gossip一致性哈希consistent节点再平衡rebalance前言Demo源码:Simple-Distributed-Cache欢迎Star代码较简单,分析源码仅分析重点项目介绍 本项目刚开始实现了基于HTTP/REST的内存缓存服务,受限于HTTP协议解析,性能不高。而后实现了一个基于TCP的缓存服务提升性能,对于TCP来说,需要自己定义一套序列化规范来解析缓存的get原创 2022-04-06 23:36:27 · 1446 阅读 · 0 评论 -
golang安装protoc和gRPC步骤
golang安装protoc和gRPC步骤1. 将gopath/bin目录添加系统的环境变量中2. 安装protoc3. 对应的插件安装4. 安装完成1. 将gopath/bin目录添加系统的环境变量中2. 安装protoc进入这网站 ,根据自己的需求下载对应的文件,进入下载文件的bin中,把protoc.exe赋值到gopath/bin的目录中https://github.com/protocolbuffers/protobuf/releases3. 对应的插件安装在命令行中输入下面两句原创 2022-03-22 21:00:56 · 2729 阅读 · 2 评论 -
职业的乐趣
职业的乐趣摘自人月神话摘自人月神话 编程为什么有趣?作为回报,它的从业者期望得到什么样的快乐? 首先,这种快乐一是种创建事物的纯粹快乐。 如同小孩在玩泥巴时感到快乐一样。成年人喜欢创建事物,特别是自己进行设计。我想这种快乐是上帝创造世界的折射,一种望现在每片植特的。腐新的树叶和雪花上的喜悦。 其次,这种快乐来自于开发对他人有用的东西。内心深处,我们期望我们的劳动成果能够被他人使用,并能对他们有所帮助。从这一角度而言,这同小孩用粘土为“爸爸的办公室”捏制铅笔盒没有任何本质的区别。 第三,快乐原创 2022-02-26 17:04:02 · 172 阅读 · 0 评论 -
go-issues#14592 runtime: let idle OS threads exit 内核线程暴增与线程回收问题
issues#14592前言CPU线程与OS线程为什么会产生空闲线程如何限制最大线程数量怎么回收空闲线程总结前言 在社区issues#14592可以看到,go中的空闲线程是不会自动回收的(注意是线程而不是协程,GMP模型中的M),那么就衍生出了三个问题为什么会产生空闲线程如何限制最大线程数量怎么回收空闲线程CPU线程与OS线程这个一级目录算是补充一下os的知识吧 CPU线程与OS线程有什么区别和联系呢?操作系统中的进程可以很多,进程中的线程就更多了,常常有几十个上百个。OS中的线程有原创 2022-02-18 23:19:04 · 607 阅读 · 0 评论 -
Golang分段锁
Golang分段锁介绍代码介绍因为golang的原生map是非并发安全的,所以为了保证map的并发安全,最简单的方式就是给map加锁。直接对一个map加锁,当访问map的请求越来越多,都竞争这一把锁使得并发访问变慢。分段锁是一种锁的设计,并不是具体的一种锁,分段锁顾名思义就是将锁分段,将锁的粒度变小,将存储的对象分散到各个分片(shard)中,每个分片由一把锁控制,我们将 key 分散到固定数量的 shard 中避免 rehash 操作。shard 是有锁保护的 map, 当 shard 进行 reh原创 2022-01-22 23:11:18 · 950 阅读 · 0 评论 -
Golang随笔之自动类型推导[:=]踩坑
:=情景1情景2总结情景1这种情况下,已经有了cnt变量,用[:=]的话,就不用在外面定义err了,直接在代码处写即可,此时cnt变量就是var cnt int这个变量,cnt没有因为自动类型推导[:=]而变成新的变量package mainimport "fmt"func main() { var cnt int cnt, err := Test() if err != nil { return } fmt.Println(cnt)}func Test() (int, er原创 2021-12-16 00:47:51 · 431 阅读 · 0 评论 -
Golang实现Raft一致性算法
Golang实现Raft一致性算法前言流程分析功能实现运行步骤与测试参考资料前言本文在理解raft算法的基础上,实现了简易版的raft算法github源码地址流程分析//TODO 明天再优化流程图,累了功能实现节点状态分为Leader(领导者)、Follower(追随者)、Candidate(候选人)节点间随机成为candidate状态并选举出Leader,且同时仅存在一个LeaderLeader节点定时发送心跳检测至其他Follower节点Follower节点们超过一定时间未收到心原创 2021-12-09 00:36:11 · 1812 阅读 · 0 评论 -
Golang随笔之《Go专家编程》查漏补缺
《Go专家编程》前言第一章 常见数据结构的实现原理管道普通使用场景v, ok := <-ch的ok含义读写channel底层逻辑图例slice简单表达式:扩展表达式:解释iota本质string双引号和反单引号的区别string的注意点for-rangerange不同类型的区别前言本文仅作书籍阅读笔记,查漏补缺第一章 常见数据结构的实现原理管道普通使用场景读写nil管道均会阻塞,而且是永久阻塞关闭的管道仍然可以读取数据向关闭的管道写数据会触发panicv, ok := <-原创 2021-11-24 20:12:21 · 629 阅读 · 0 评论 -
golang随笔之slice+append的陷阱
slice+append问题初探解析总结Go中没有引用传递问题初探package mainimport "fmt"func main() { s1 := []int{1, 2} s2 := s1 s2 = append(s2, 3) Test1(s1) Test1(s2) fmt.Println(s1, s2)}func Test1(s []int) { s = append(s, 0) for i := range s { s[i]++ }}A:[2,3]原创 2021-11-23 19:41:20 · 1049 阅读 · 0 评论