- 博客(146)
- 资源 (5)
- 收藏
- 关注
原创 swagger报错:ParseComment error in file xxx.go :cannot find type definition: response.RR
先给出解决方案,没有兴趣了解具体的原因,以及swag的源码的可以直接看第一部分即可。命令行中增加一个参数:pdl。参数用于控制是否解析外部依赖文件夹,以及解析的级别。
2024-09-19 15:01:38 680
原创 redis有序集合写入和求交集的速度
团队小伙伴做了一个需求。大概的需求是有很多的图片作品,图片作品有一些类别,每个人进入到每个类别的作品业,根据权重优先查看权重最高的的作品,权重大概是基于每个人对该作品的浏览计算,浏览过的作品放在最后展示。小伙伴是基于redis的有序集合的方式实现的,主要用到写入和求交集这两个操作。我们这个系统的作品数量不算多,目前只有5000左右,用户也只有5000左右,这么小的数据量用这种方式实现,我原本觉得是没什么问题的。但是,实际测试下来,就很离谱,不知道他的程序里哪里导致的异常耗时。
2024-09-14 16:38:42 489
原创 golang闭包中变量获取
闭包的本质是一个语法糖,其本质是获取外部变量在其内部使用。文中case2和case3并未涉及闭包,只是作为对比案例。case4这个案例有点不能理解,汇编看着太吃力了。case4和case5留待后续再研究。
2024-09-05 17:46:16 861 1
原创 gorm scan查询报了Scan error on column index 0, name \“count\“: converting NULL to int is unsupported
解决方案:使用sql.NullInt64。
2024-09-05 15:17:04 159
原创 基于约束大于规范的想法,封装缓存组件
架构?何谓架构?好像并没有一个准确的概念。以前我觉得架构就是搭出一套完美的框架,可以让其他开发人员减少不必要的代码开发量;可以完美地实现高内聚低耦合的准则;可以尽可能地实现用最少的硬件资源,实现最高的程序效率......事实上,架构也并非只是追求这些。因为,程序是人写出来的,所以,似乎架构更多的需要考虑人这个因素。我们发现,即便我们在程序设计之初定了诸多规范,到了实际开发过程中,由于种种原因,规范并没有按照我们预想的情况落实。这个时候,我的心里突然有一个声音:约束大于规范冒了出来。
2024-09-03 15:58:25 1126
原创 docker启动MySQL
参数 -p 设置端口,--name 取名 ,-e MYSQL_ROOT_PASSWORD=123456 设置 账号为 root ,密码为 123456 ,-d 表示作为一个守护进程在后台运行。从容器中将配置文件复制到本地的命令:docker cp 容器id:/etc/my.cnf E:/docker/mysql/conf。使用docker exec -it 容器id /bin/bash进入docker容器。使用docker ps命令查看启动的docker进程。这篇文章只做记录,没有什么值得一看的内容。
2024-08-21 10:23:38 216
原创 令人困惑的mysql索引
头疼,数据库索引太复杂了,这些case,给了我诸多的困惑,我还需要更深入地学习一下索引的底层原理,方可理解这些case。
2024-08-20 11:45:07 365
原创 为什么MySql使用B+树
对于B树,由于内部节点上存了数据信息,导致一页上索引元素相对就少了很多,第一次搜索到Page1,据此,可以定位到Page4,30到50之间的数据就可以拿到了,这个时候需要进行一次中序遍历,先回到Page4的根节点,再执行一次中序遍历返回到Page1和Page2的根节点,最终搜索到Page2,由此定位到Page5,获取50到60之间的数据,由此,可见,为了获取这个范围内的数据,需要多了几次遍历查找。B树有两个特点,和二叉树相比,B树每个节点有更多的子节点,B树每个节点上不仅有索引信息,还存放了数据。
2024-08-16 10:45:50 402
原创 覆盖索引和聚簇索引
假如,我选择第二种情况,每一个索引,都保存全量信息,行不行,这种情况当然可以,比如,我根据userId查询name信息,由于我已经冗余保存了所有的信息,因此,可以拿到name信息。那现在看来只有第一种方案了,由于我在userId上建立索引,我最终保存的数据是userId和id信息,也就是有了userId和id的map关系,我们还是通过userId查询name信息,首先是根据userId信息查询到了id信息,但是这个地方没有name信息,这个时候,怎么办呢?id是数据库自动生成的,这张表的主键。
2024-08-16 10:32:11 257
原创 基于kafka-go写的生产者和消费者
这一篇文章,主要是基于kafka-go写的生产者和消费者的代码。我自定义了一个kafka消息体,消息体中,有一个actionType的概念。为什么要有这么一个定义呢,主要是考虑到kafka的topic的颗粒度不能太细,太细会导致kafka的性能下降,所以,我们的消费需要基于actionType进行细分,以提升消费的并发能力,这里指的是从业务的角度来提升消费能力,而不是通过kafka自身的调整。
2024-08-14 15:05:13 444
原创 kafka-go使用:以及kafka一些基本概念说明
作为开发人员kafka中最常关注的几个概念,是topic,partition和group这几个概念。topic是主题的意思,简单的说topic是数据主题,这样解释好像显得很苍白,只是做了个翻译。一图胜前言,我们还是通过图解来说明。生产者负责写数据,一个topic可以有多个分区。如下图所示,生产者写数据的示意。,即消息在某个分区上是有顺序的,而全局是没有顺序的。这个意味着如果我们需要保证顺序,我们在写消息时需要往同一个分区中写数据。比如,我们有一个场景,有一个订单。
2024-08-09 16:33:33 949
原创 http请求:报unexpected EOF错误
程序中有个地方需要读取body内容,打印bodyBytes的内容总是少了一截。接口还返回了unexpected EOF这个错误。之前遇到这个错误都是因为传参不是个json格式,用json在线工具验证了一下,是个正确的json格式。
2024-07-29 18:15:42 449
原创 关于联合索引和最左匹配原则
这种方式可以极大地提升我们的查询速度,但是,以首字母A发音开头的汉字依然非常多,为了增加查询的速度,我们就需要“联合索引”,比如,第二个字母依然按照A,B,C......这样的方式建立索引,比如,我们想要查找“危”这个字的位置,我们先通过首字母W确定了其位置,然后在W这个前提下再通过第二个字母“E”确定其范围。这个查询是能够命中索引的。原因很简单,因为,这种情况下,B+树可以根据第一级索引,定位到该在哪些节点上查找数据,从而不需要全表扫描,就像我们前面类比的案例,我们能够通过首字母定位到具体的范围。
2024-07-23 11:56:06 675
原创 Grafana :利用Explore方式实现多条件查询
比如:我需要查询日志中包含“/api/v1/warranty/list-by-uid”和“20291205TS00584Z”这两个字符的日志。日志统一推送到Grafana上管理。所以,有了在Grafana上进行日志搜索的需求,而进行日志搜索通常需要多条件组合。通过Grafana的Explore的方式实现多条件查询。选择标签,点后面的“+”可以选择多个过滤标签条件。如此,就实现了多条件日志查询的功能。在主页搜索框中输入“Explore”
2024-07-18 16:49:23 846
原创 golang json反序列化科学计数法的坑
id=33&new_warranty_end_time=1.7208e+09&old_warranty_end_time=1.7207136e+091720755503589{{加密盐值}}经过查询发现,问题出现在json.Unmarshal(bodyBytes, &jsonBody)这个地方,反序列化之后,出来的就是科学计数法的类型。这个部分跟我们的问题不太相关,我们暂且略过。这个问题我们到源码中寻找答案,我们先看这个问题的解决方案。我们可以看一下反序列化之后的数据类型和值,解析为了float类型。
2024-07-12 16:52:14 612
原创 go mod模式下,import gitlab中的项目
第一步:创建一个公用包的项目,比如,core。这里有个点需要注意,不能直接用go mod init进行初始化,否则,引用该包会报路径错误的问题。需要通过这个命令进行初始化(init后面的内容实是ssh链接去掉git@)。执行完之后,push到gitlab上。公用包创建的流程到此就完成了。接下来就是引用包需要做些一些配置。第二步:第三步:需要设置两个环境变量。GOPRIVATE。
2024-05-23 15:55:36 1141
原创 gorm log with traceId 打印带有traceId信息的日志,通过context实现
于是乎,我们就希望有一个全局的traceId可以把一个请求过程中经过的所有链路的关键信息串联起来,这样的话在检索日志的时候可以带来极大的方便,根据traceId把整个链路上的日志全部打印出来。在初始化日志的地方,传从Context中获取对应参数的函数,比如,从context中接受traceId。我们首先需要了解gorm日志打印是如何实现的,任意找一个sql执行方法进去,比如,查询的方法。我们回到前面打印日志的地方,看打印日志的方法,打印日志的Trace方法是这个接口下的一个方法。
2024-05-15 16:32:10 845
原创 /swagger/index.html#/ 的页面可能存在问题,或者已永久移动到新的网址。
在golang的项目中,使用了swagger。新的项目中,用了和之前项目同样的web框架,仔细比对了和之前项目的差异,只不过,目录结构做了调整,所以,首先想到的是目录结构调整导致的问题。于是,把目录结构调整为和之前一直的目录结构。上网搜了一下,没有发现类似的问题。尝试了各种方法,依然没有解决这个问题。无意中看到,浏览器对于6666这样的端口有限制,换了端口,果然解决了问题。关于为什么会有这样的限制,我没有找到太多的资料,有知道的朋友,帮忙解释一下。6666是什么特殊的端口,浏览器为什么有限制?
2024-05-06 11:50:45 1127
原创 http请求头导致了dial tcp:lookup xxxx on 10.43.0.10:53 no sunch host
事实证明人有的时候也不能太偷懒,太偷懒容易给自己埋坑。
2024-04-11 15:42:19 625
原创 golang函数式编程
这意味着,只要这个闭包还在被使用,`a` 和 `b` 就不会被销毁,它们会一直存在,直到闭包不再被使用。golang 中函数是一等公民,对于函数式编程这个思维方式我还很不习惯,在看go-zero的源码过程中,显得很是吃力,go-zero中mapreduce中使用了这个编程思想,为了习惯这种思维方式,我得从基本的函数式编程开始。在这段代码中,闭包 `func() int` 保持了对 `fibonacci` 函数中的局部变量 `a` 和 `b` 的引用。5.测试:通过定义Func类型,可以方便地进行单元测试。
2024-04-09 14:27:41 628
原创 开启多个协程,并行对struct中的每个元素操作,是否会引起并发问题?
写程序时,我们经常会有这样的场景,某个对象中的信息需要从不同的服务中获取,如果我们采用顺序读取的话,就会导致耗时很长,所以,我们时长需要并行从不同服务中获取对应的信息进行组装。我这边直接使用了go-zero中并行执行函数的小工具,这倒没什么,只不过,在使用的时候,有个问题引起了我的注意,这个用法是否安全?期初,我是很犹豫这种写法的正确性,因为,我以为struct是个整体。后面,我实际打印了struct中每个元素的地址,每个元素的地址是不同的,所以,对于struct而言,每个元素应该都是一个独立的变量。
2024-04-07 14:42:38 340
原创 透传http请求遇到了一个小坑
在Go语言的HTTP处理中,io.ReadAll(ctx.Request.Body)读取了请求体的全部内容,并将它存储在一个字节切片中。这个操作会消耗掉请求体的内容,因此,如果你尝试再次读取ctx.Request.Body,你会得到一个空的读取器(reader),因为数据已经被读取过了。
2024-04-02 10:28:02 289
原创 java环境安装,环境变量配置(仅作记录)
在cmd窗口中输入java -version,可以看到安装的java环境的版本,至此,java环境安装成功。环境变量名:JAVA_HOME 变量值:jdk目录位置。win+r调出cmd窗口,输入java,敲击enter键。Path中添加变量值:%JAVA_HOME%\bin。此文档仅是自己安装jdk环境的一个记录文档。
2024-03-06 09:52:10 358 1
原创 golang:mutex理解
为了解决,这种状况,需要制定一个新的规则,就是一段时间内,队列中的goroutine没有被执行过,则优先执行队列中的goroutine,让新来的goroutine去队列中排队等待执行。无忌道:"上面的规则我们还是保留,只是需要做点调整,在排队的人,等的时间超过了10分钟,那么有新来的人还是验明身份做登记排到队伍的后面,过一段时间再切换为新来的人优先观看屠龙宝刀。是新来的还是刚被唤醒的,新来的加入到等待队列的尾部,刚被唤醒的加入到等待队列的头部,然后通过信号量阻塞,直到当前。
2023-08-25 15:02:35 142
原创 golang函数传参——值传递理解
因此,第一个案例中,实际上是把指向底层数组的指针的地址拷贝生成一个副本传到了函数体中,所以,第一个案例中修改了0xc00006c0a0地址里的内容会引发外面的参数发生变化。一直以为golang中函数传参,如果传的是引用类型,则是以引用传递,造成这样的误解,实在也不能怪我。打印的函数参数的地址和外部slice的地址是一致,并且在函数体内修改的值的确影响了slice的值,由此现象很容易得出是。实际结果,验证了我们的猜想,扩容之后,开辟新的内存地址来存放内容,因此,再修改这个参数也不会影响外部参数。
2023-08-04 16:19:31 1289
原创 golang编译出现问题
项目中引入了第三方包(github.com/jinzhu/copier),编译的时候出现了go: github.com/jinzhu/copier@v0.3.5: verifying go.mod: github.com/jinzhu/copier@v0.3.5/go.mod: reading http://192.168.24.11:3000/sumdb/sum.golang.org/lookup/github.com/jinzhu/copier@v0.3.5: 502 Bad Gatewaygo:
2022-07-01 09:55:33 1233
原创 golang 关于引用和指针的深拷贝的问题
问题现象定义一个对象,对象中嵌套定义了map类型和一个对象,复制原来的对象生成新的对象,改变新对象中map的值和嵌套的对象的值会导致原来的对象的值也被改变。现象模拟package mainimport ( "encoding/json" "fmt")type StudyCopy struct { Name string Reference map[string]interface{} Nested *Nested}type Nested struct {
2022-03-30 14:16:25 1648
原创 office 365收不到取消的会议
取消的会议在office 365的日历中无法显示,通过在office 365的日历中收到导入该附件,显示文件已破坏,无法导入成功。
2022-03-02 11:44:59 511
原创 golang beego使用踩坑记录
conf文件中,数组型数据不能放在前面,会导致其他的如string型数据解析为空这种数组型数据要放到文件的最后。一不小心引入了bug,花了一天时间才往配置文件方向考虑,终于定位到问题了...
2021-12-02 10:48:05 174
转载 解决This function or variable may be unsafe
https://jingyan.baidu.com/article/49711c616b8a1ffa441b7cdc.html
2021-09-25 21:54:10 104
原创 C++ error LNK2019无法解析外部符号
背景:用visual studio 2019开发MFC项目,第一次写c++的项目,之前都是写c#和go的项目。自定义一个类,引用自定义的类,具体的是引用.h文件,死活不成功,一直报error LNK2019无法解析外部符号这个错误,但是引用.cpp文件却是可以成功的。没搞过c++的项目,但是觉得引用cpp文件能编译,肯定不是最佳解。于是,开始了我的头铁之路,真是查了半天的资料,把网上能看的文章都看完了(当然,网上的文章雷同度太高了),就是不行。最终还是解决了。首先,因为我写go和c#项目的习惯,把不
2021-09-11 20:59:47 930
原创 mongodb 批量把date类型数据改为时间戳
db.customer_poster.find().forEach( function(res){ print("poster_id:",res.poster_id); if (res.update_time instanceof Date){ var updateTime=res.update_time.getTime(); updateTime=updateTime/1000; updateT.
2021-09-02 14:59:34 722
C#公共通用类
2018-09-07
ASP.NET MVC 5高级编程 第5版(中文版)
2018-07-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人