攻城狮joe
希望能和大家相互学习,相互交流,提升自己!
展开
-
Error:sql: expected 1 arguments, got 2
【代码】Error:sql: expected 1 arguments, got 2。原创 2024-07-09 22:50:30 · 76 阅读 · 0 评论 -
如何基于Redis实现消息队列
发布/订阅是一种消息通信模式,其中消息生产者(发布者)发送消息,而消息消费者(订阅者)接收消息。需要说明的是,Redis提供的消息队列功能适用不同的场景,在实际使用过程中,要根据自己的需求来选择!适合自己的才是最好的!Redis Streams是专为消息队列设计的高级数据结构,提供了持久化、消费者组、消息确认等功能。原创 2024-06-15 00:01:57 · 117 阅读 · 0 评论 -
Golang 模糊测试的使用
其本质上是一种自动化测试技术,更具体一点,它是一种基于随机输入的自动化测试技术,常被用于发现处理用户输入的代码中存在的bug和问题。模糊测试和常规的功能测试的最主要区别是:模糊测试时候,因为输入不可控,所以不能精准预测输出。举个例子说明,一般流程如下:我们有个方法,用来翻转一个字符串;通过运行结果,可以看到,我们的方法通过了测试用例,说明我们这个方法没问题。如果不带上这个参数,模糊测试会一直执行下去,直到遇到报错;带上这个参数,带上时间,执行完这个时间,模糊测试就自动终止了。在我的环境里面,运行。原创 2023-02-12 22:00:50 · 618 阅读 · 0 评论 -
Go语言生成UUID的教程以及对应的源码分析
摘自维基百科:UUID 的目的是让分布式系统中的所有元素,都有能够为方便的辨识信息,来表示唯一的序列号,无需考虑数据库创建时名称重复问题。UUID按照标准方法生成时,在实际应用中具有唯一性,且不依赖中央机构的注册和分配。UUID重复的概率接近零,可以忽略不计。在其规范的文本表示中,UUID 的 16 个 8 位字节表示为 32 个十六进制数字,由连字符 ‘-’ 分隔成五组显示,形式为“8-4-4-4-12”总共 36 个字符(32 个十六进制数字和 4 个连字符)。原创 2022-12-08 22:15:28 · 1304 阅读 · 0 评论 -
Mac下,protoc-gen-go-grpc: program not found or is not executable问题的解决
大部分情况下,问题就解决了!但是我这边,通过上面的方式安装失败了,死活安装不成功(mac环境);可以看到,安装成功了!于是再执行生成pb文件的命令,此时就成功 了!在公司的项目中,需要把对应的proto文件生成对应的pb文件,当执行。后来想,既然是安装插件嘛,为啥不用Mac自带的命令方式呢!在网上找了下对应的问题,看了不少文章,解决的方案就是安装。没有被安装,导致执行脚本的时候,没有找到对应的插件去处理。造成的后果是,对应的pb文件没有被生成!出现这个问题的原因,简单说,就是。原创 2022-11-23 22:17:51 · 4820 阅读 · 2 评论 -
无重复字符串的最大长度之基于Golang的实现
之前在看网络相关的的书籍时,书上说的有滑动窗口协议,用于数据传输;虽然知道这个东西,但如何实现确实没有考虑过!通过力扣,发现有的题目着实还不错,值得学习!以后也要多刷刷题目!一看到这道题目,我就想到用双循环的方式来处理。(看到注解里面有人说,这个问题要基于滑动窗口的方式解决;这个实现应该就是滑动窗口的方式)对这道题目很感兴趣,于是自己就研究了下,花费了不少时间,终于用Golang的代码解出了这道题目。:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。原创 2022-11-13 21:55:05 · 317 阅读 · 0 评论 -
Golang源码:singleflight分析(二)
Group结构只有两个字段,m是一个map,key是相同请求的标识,value是用来保存调用信息,这个map是懒加载,就是在使用时才会初始化;mu是互斥锁,用来保证m的并发安全。wg sync . WaitGroup // 存储返回值,在wg done之前只会写入一次 val interface {原创 2022-10-31 06:00:00 · 254 阅读 · 0 评论 -
Golang源码:singleflight分析(一)
wg . Add(10) //模拟10个并发 for i := 0;i < 10;i ++ {= nil {log . Print(err) return } log . Println(data) }() } wg . Wait() } //获取数据 func getData(key string)(string , error) {//模拟从db中获取数据 data , err = getDataFromDB(key) if err!原创 2022-10-24 22:39:06 · 348 阅读 · 0 评论 -
Golang fsm源码分析
可以理解成:某个事件(状态),由一系列其他的 事件(状态)转换而来;比如房门状态:事件名称为:开门事件,源状态:关;门只有在关闭的情况下才能转换为打开状态。在这个库文件里面,提供得有对应的代码示例;在这里,我选择其中的一个例子做个示范;在项目实践上,我们也有用到关于FSM。我的这篇文章就是对这个库文件的源码做一个分析。它定义了当前状态是如何装换的;在这个里面,最主要的是。中定义状态转换映射的缩写;原创 2022-10-06 16:00:09 · 532 阅读 · 0 评论 -
go mod download: invalid proxy URL missing scheme: on
我的Golang版本是1.18,然后借助于公司的梯子,能够访问外网的那种(谷歌,YouTube,Facebook都能打开);按照道理来说,go mod下,应该是毫无压力的,那为啥会报这个错误呢?研究了好长时间,在同事的指点下,终于把这个问题解决了。平时连得内网,特意这么设置的,所以没啥问题;但是借助于梯子后,能访问外网,这样搞,就有问题了。当我把这个配置修改成。最近在处理一个项目的时候,需要下载依赖;问题出现Go Env的配置上;更具体的说,就是配置。后,再连上外网,就没问题了。原创 2022-10-01 10:57:37 · 1915 阅读 · 1 评论 -
Golang log包的源码分析
第二个参数prefix设置日志的前缀,第三个参数设置日志的属性。这个里面,先把prefix放入slice里面,然后分别把属性以及刚才获取得到的文件相关信息放到这个slice里面。通过调用log包提供的函数,可以实现简单的日志打印功能。沿着这3个函数往下分析,可以看到,底层调用了同一个函数。这个函数最终会返回函数名,文件以及对应的行数等;版本的(低于这个版本的,源代码略有区别,可以忽略不计);log对象的创建,有对应的。在这个里面,最主要的是调用了。需要加以说明的字段是。包里面,提供了3个系列的函数,分别。原创 2022-09-29 22:48:16 · 459 阅读 · 0 评论 -
Golang errors包的源码分析
最近研究源码的时候,发现很多地方都用到了errors包里面的内容,对这个很感兴趣。因此,就想把这个包给研究下。原创 2022-09-21 22:49:28 · 359 阅读 · 2 评论 -
Golang之 runtime.Caller使用
英文注释里面有这个函数的使用说明:这个函数上报协程堆栈中的调用函数的文件以及行号的相关信息;这个参数`skip`表示堆栈桢的数量,0表示当前调用这个函数的这一层级。返回的第一个参数`pc`表示的是程序计数器。返回的就是调用函数的程序计数的相关值,包括函数名,文件,行号等信息。这个函数的使用以及源码产生了兴趣,因此研究了一番。原创 2022-09-18 16:45:19 · 278 阅读 · 0 评论 -
Golang context包的源码分析
context.go文件里面,主要有4个struct体,都继承Context接口;四个struct体 分别是emptyCtx、cancelCtx、timerCtx、valueCtx。提供了获取对应结构体的方法:WithCancel,WithDeadline,WithTimeout,WithValue;结构如图:我们就按照这个顺序,分别介绍对应的Context。原创 2022-09-15 23:35:46 · 164 阅读 · 0 评论 -
Go的编程过程中,你会犯这些错误吗?(三)
你可以把接口值nil想象成有类型的,没有类型的nil不等于有类型的nil。数组,切片和字符串都是从0开始索引的,所以a的值可以在a[0],a[1],a[2],…在使用闭包的同时也可以避免这种数据竞争,但是我们必须注意为每个goroutine使用唯一的变量。只有当接口的值和动态类型都为nil时,接口的值才等于nil。被6个协程共享:当两个Go的协程同时访问同一个变量,并且其中至少有一个是写操作时,就会发生数据竞争。,它应该匹配一个零或多个数字的字符串,匹配一个包含字符的字符串?翻译 2022-09-12 10:56:42 · 80 阅读 · 0 评论 -
Go的编程过程中,你会犯这些错误吗?(二)
当无法从上下文推断出类型时,无类型的常量会根据常量的格式转换为bool、int、float64、complex128、string或rune。在这种情况下,常数是一个整数,但是。2.14.1 勾股定理是勾股定理的整数解,a2 + b2 = c2。此外,只允许后缀表示法。如果我们按照标准的习惯用法使用不等式,编译器将捕获错误。这会溢出(因为一个字节的最大值是255),结果是。函数的返回值是复制的元素数量。(6,8,10)是另一个例子,但Go中似乎不成立。要获取完整的副本,必须分配一个足够大的目标。翻译 2022-09-11 23:06:09 · 81 阅读 · 0 评论 -
Go的编程过程中,你会犯这些错误吗?
的元素时,你相当于是修改了对应的底层数组中的元素值,这样依赖相同底层数组的。2. 当你在方法中传递一个数组的类型时,数组会被复制。另外,Go的编译器会检测并且不允许某些变量覆盖。是nil(空),那么使用它的指针引用在运行时会异常----不能存储任何元素,它只是描述了底层数组的一部分。Go中的字符串是不可修改的,就像是一个可读的。格式的字符都会从字符串中移除,所以就会返回一个空字符串。在一个网站上看到一篇很好的文章,题目是。2.5.1 为什么下面的程序编译不了?1. 在Go中,数组是值类型;翻译 2022-09-11 12:33:43 · 79 阅读 · 0 评论 -
你遇到过哪些高质量的 Go 语言面试题?
实名反对高票答案,全是些cgo的问题,真正跟go核心相关的channel,goroutine都没问。而且各种假大空,动不动就性能,我特么10w长度的slice都没性能问题,你这动不动就要优化底层数据结构?有这功夫不如看看channel,slice,map,这些数据结构怎么实现的,免得以后死锁,slice扩容这种问题踩坑。我举例的问题都比较简单,完全可以对这些方面细节考察然后进行扩充,最后整理出一套比较综合的题目,给自己或者他人。之前面过几家go的,也做了一段时间go,简单谈下我遇到的坑吧。原创 2022-09-04 22:55:24 · 314 阅读 · 0 评论 -
Go语言实战的知识图谱
分为9章,略有改动;只有一个总体的框架图,一些细节的东西没有写上去;具体细节大家可以自行研究。原创 2022-09-01 09:00:00 · 177 阅读 · 0 评论 -
Go语言中开启和退出协程(二)
context意思是,context是来传递信息的:服务端可以创建一个context,而请求方应该接受这个context;在方法的调用链中,必须传递这个context,在创建context中,可选参数有WithCancel,,,WithValue;当一个context取消时,由它派生出的所有(子)context也会随之取消。...原创 2022-08-28 12:51:49 · 228 阅读 · 0 评论 -
Go语言中开启和退出协程
协程(coroutine)是Go语言中的轻量级线程实现;与线程不同的是,协程不受操作系统调度,协程的调度由用户程序自行提供;Go语言中的协程调度器将协程调度到线程中运行。在Go语言中,协程的创建很容易,关键字是Go:例如,用。在Go语言中,退出协程有两种方法:1 通过。在这里,先将如果通过通道的方式,退出协程。开启了两个协程,第一个协程是。以上所有的都执行完成后,输出。里面如果有值,则关闭通道。即开启了一个新的协程。原创 2022-08-22 23:09:25 · 1829 阅读 · 0 评论 -
Go语言圣经的知识图谱
分为10章,略有改动;只有一个总体的框架图,一些细节的东西没有写上去(对我自己来说,觉得没必要,因为这些东西都会;如果是初学者,建议按照这个框架来研究,包括细节)原创 2022-08-20 23:07:44 · 305 阅读 · 0 评论 -
package DotaChessSelfPlay is not in GOROOT以及 relative import paths are not supported in module mode
在网上找了不好资料,但是都没解决!然后不想找了,直接观察项目文件,发现项目中缺失。那么是不是因为缺少这个文件导致的呢?执行程序后,项目运行成功了!因此在运行这样的项目时候,先执行。今天研究一个开源项目的时候,进行。提出的开发包管理工具,一些老的项目是没有。,然后再去下载依赖包,即可正常运行项目!,发现之前的错误提示都消失了!是要依赖于这个文件的。......原创 2022-08-04 20:10:28 · 880 阅读 · 0 评论 -
Golang swagger :missing required param comment parameters
Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务。总体目标是使客户端和文件系统作为服务器以同样的速度来更新。文件的方法、参数和模型紧密集成到服务器端的代码,允许API来始终保持同步。Swagger让部署管理和使用功能强大的API从未如此简单。...原创 2022-08-01 09:00:00 · 1517 阅读 · 1 评论 -
Golang sync/atomic 包的原子操作说明
具体的原子操作在不同的操作系统中实现是不同的。比如在Intel的CPU架构机器上,主要是使用总线锁的方式实现的。大致的意思就是当一个CPU需要操作一个内存块的时候,向总线发送一个LOCK信号,所有CPU收到这个信号后就不对这个内存块进行操作了。等待操作的CPU执行完操作后,发送UNLOCK信号,才结束。原子操作即是进行过程中不能被中断的操作,针对某个值的原子操作在被进行的过程中,CPU绝不会再去进行其他的针对该值的操作。包避免了加锁解锁的过程,一行代码就可以完成这个操作,使代码更简洁,更具有可读性。...原创 2022-07-29 21:57:13 · 237 阅读 · 0 评论 -
Golang invalid argument to intn报错的解决
最近的项目中,因为要处理随机的问题,所以使用到随机数。项目在测试的过程中,突然报错了invalidargumenttointn;事实上,这个报错是随机函数的源码实现中的提示;当传入的参数小于等于0时,就会抛出这个提示;为什么会有这样的提示呢?原因是,它的实现源码里面对入参值有判断;当不符合规范时,直接抛出。我这边使用的随机函数,是golang内置的包。我这边在使用的时候,未对入参。,这个方法入参是一个非负数;进行判断,在某些情况下,入参。...原创 2022-07-20 21:05:26 · 1829 阅读 · 0 评论 -
Golang signal.Notify 信号的退出
信号(Signal)是Linux,类Unix和其它POSIX兼容的操作系统中用来进程间通讯的一种方式。一个信号就是一个异步的通知,发送给某个进程,或者同进程的某个线程,告诉它们某个事件发生了。当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。如果目标进程先前注册了某个信号的处理程序(signalhandler),则此处理程序会被调用,否则缺省的处理程序被调用。摘取来源在POSIX.1-1990标准中定义的信号列表c。...原创 2022-07-16 20:48:50 · 537 阅读 · 0 评论 -
Golang go-svc包源码分析
在研究NSQ源码时,发现了一个问题;如下: 的源码方法: 的源码方法: 的源码方法: 可以看到,在三个主要的方法中,都包含了、、三个方法;为什么会这样用呢?原因在于,中,使用了包,来启动相关程序,使得在程序退出的时候可以做一些释放资源等收尾工作。因此,这篇文章,主要就是用来分析包的代码。 包的源代码地址,它的代码定义如下: 通过定义的包,可知,我们的服务调用,对应的服务,必须要实现里面的、、三原创 2022-07-10 11:56:23 · 421 阅读 · 0 评论 -
Nsq中WaitGroup的封装使用
在看NSQ源码的过程中 ,发现了NSQ中,对操作的封装,觉得值得学习一番,因此记录下自己的感悟。 WaitGroup位于sync包中,用于控制协程间的同步。WaitGroup使用场景与名字的含义一样:当我们需要等待一组协程都执行完成后,才去做后续处理时,就可以考虑使用。 定义以及方法如下: WaitGroup的使用非常简单,它提供了三个方法: 使用的demo如下: 执行结果如下:(需要注意的事,每次执行的顺原创 2022-07-03 11:06:54 · 103 阅读 · 0 评论 -
Golang 装饰器模式以及在NSQ中的使用
最近在研究NSQ这款中间件,发现了一些有意思的东西,装饰器模式就是其中一个。在整个项目中,装饰器模式的使用随处可见,因此有了这篇文章。 装饰器模式属于设计模式的一种,它的定义,简单来说,就是在不改变对象的内部结构情况下,动态地扩展对象的功能。通过创建一个装饰器,包装真实的对象,给对象增加新的功能特性。在Java中,IO就是典型的应用到了装饰器模式;Python中,更是在语法上原生支持,这大大提高了装饰模式在 Python 中的应用。 我们举个例子来看一下装饰器的应用。首先原创 2022-07-02 22:30:01 · 231 阅读 · 0 评论 -
Golang 匿名函数使用
最近在研究NSQ中间件,在研究这个中间件的过程中,发现了一些自己在平时开发工作中未使用到的Golang特性;决定记录下在这个过程中学习到的一些知识;本篇文章要写的,是关于Golang匿名函数的使用 匿名函数没有函数名只有函数体,他可以作为一种类型被赋值给函数类型的变量,匿名函数也往往以变量方式传递。 Go语言支持随时在代码里定义匿名函数。 匿名函数,由一个不带函数名的函数声明和函数体组成。简而言之,就是匿名函数可以将作为普通变量使用:能在函数中传递或者是赋值给变量。原创 2022-06-26 15:07:47 · 237 阅读 · 0 评论 -
NSQ源码安装运行过程
最近对NSQ很感兴趣,所以想研究一下NSQ源码;要想研究源码,首先得知道怎么使用吧。因此,第一步,就是如何通过源码来安装并启动NSQ 1 下载源码,并且编译: 这样,整个NSQ项目就搞好了 2 在nsq目录下,进入build目录,如下: 可以看到,在这个目录下的nsqd,nsqlookupd,nsqadmin等可执行文件 1 在一个shell下,启动 2 在另一个shell下,启动;这里需要注原创 2022-06-18 22:24:39 · 335 阅读 · 0 评论 -
100 Go Mistakes and How to Avoid Them 之代码结构和项目组织(四)
七 返回接口类型 在设计一个方法时,我们可能不得不返回一个接口类型或者一个具体的类型。那么我们来思考下,在大多数情况,返回一个接口,在Go中是一个槽糕的实践。 我们来看下,接口存在于消费端(用户端)的情况。来看下下图,如果一个方法返回一个接口类型而不是结构体会发生怎样的依赖问题。我们将会看到,这样会如何导致问题。 设计如原创 2022-06-04 22:00:04 · 316 阅读 · 1 评论 -
100 Go Mistakes and How to Avoid Them 之代码结构和项目组织(三)
六 生产端的接口 在前面的例子中,我们看到了接口的价值所在;但是,有一个问题经常让开发者误解:那就是接口到底放在哪一端。 在讨论这个话题之前,我们先要明确在这一节里面说的相关术语的明确含义: 生产端:接口的定义与具体实现在同一个包里面 客户端(应用端):接口定原创 2022-05-29 10:36:06 · 238 阅读 · 0 评论 -
Go 语言中,for循环引起的并发安全问题
一 问题来源 最近项目的开发过程中,遇到报空指针错误的问题。追查了好久,发现是Golang的经典问题: for循环中使用了goroutine,而在goroutine中使用了for循环的参数。二 问题描述 在工作项目中,实现了一个业务需求功能;去掉业务逻辑,代码抽象出来大概是这样: for msg:= range list {原创 2022-05-22 22:59:09 · 753 阅读 · 0 评论 -
100 Go Mistakes and How to Avoid Them 之代码结构和项目组织(二)
四 过度使用getters and setters方法 4.1 Ps:没有举具体代码实例,就当成作者的一个提醒吧五 接口污染 5.1 概念 接口污染的概念,指的是,用不必要的抽象来处理代码,使其难以理解与使用。在Go中,接口一般用来定义一组规范,而不是具体实现。...原创 2022-05-15 21:23:51 · 365 阅读 · 0 评论 -
NSQ介绍
一 NSQ是什么NSQ是一个基于Go语言的分布式实时消息平台, 它具有分布式、去中心化的拓扑结构,支持无限水平扩展。无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征。另外,NSQ非常容易配置和部署, 且支持众多的消息协议。支持多种客户端,协议简单,如果有兴趣,可参照协议自已实现一个也可以。简单点说,NSQ就是一个基于Go语言实现的轻量级消息平台。二 NSQ组件1 nsqd:一个负责接收、排队、转发消息到客户端的守护进程2 nsqlookupd:管理拓扑信息, 用于收集nsqd上报的to原创 2022-03-31 23:06:33 · 356 阅读 · 0 评论 -
Golang 内存逃逸
一 什么是内存逃逸 Golang中,内存的分配有两种方式:堆(Heap)和栈(Stack);栈是计算机内存的特定区域,一般是 CPU 自动分配释放,读写很快,更重要的是不会产生碎片;堆是应用程序在运行的时候请求操作系统分配的,需要申请和释放,会产生碎片。他们直接的区别和联系,见这篇文章:什么是堆?什么是栈?他们之间有什么区别和联系  原创 2022-04-09 22:35:00 · 2994 阅读 · 0 评论 -
解决 printf missing ... in args forwarded to printf-like function (go vet)的报错问题
如下的一段代码func (t *BaseTable) DebugLogf(format string, v ...interface{}) { g.Log().Warningf("%s", fmt.Sprintf(format, v))}执行golangci-lint run的提示,提示 printf missing … in args forwarded to printf-like function (go vet);如下所示发现是Sprintf方法里面,没有把接受到的可变参数传递进去,导原创 2021-12-14 23:10:47 · 805 阅读 · 0 评论 -
Golang 在不迭代的情况下打印指针slice 以输出值而不是它们地址
一 问题来源 在开发过程中,定义的结构体中,部分属性是指针slice组成的。在调试过程中,为了让整个流程更加清晰,需要打印出这些属性值。迭代当然是一种办法,但很麻烦。那么现在问题来了:有什么办法,让我们可以使用简单的 fmt.printf() 直接获得值而不是 slice 中每个值的地址?二 代码Example 由于项目是基于公司业务原创 2022-05-10 23:19:49 · 586 阅读 · 0 评论