- 博客(71)
- 收藏
- 关注
原创 Go语法:闭包
闭包在 Go 语言中是一把 "双刃剑":它能便捷捕获外部变量,却也常因变量引用机制导致意外行为,尤其在循环与多协程场景中容易引发数据混乱。理解闭包的变量捕获逻辑,掌握副本创建技巧,是写出安全可靠代码的关键。:goroutine 启动时可能循环已经执行完毕,所有 goroutine 都访问到最终的。的值为 3,所以所有函数调用都输出 3。:在每次循环中创建一个局部变量副本。:所有闭包都引用了同一个变量。:通过参数传递当前值。
2025-08-03 14:08:45
518
原创 Go语法:引用/值传递
结构体传递地址时,可修改结构体(包括多层嵌套),但存在差异:字段为引用类型:本身存地址,修改字段指向的数据会影响原始值;若重新创建整个元素并赋值,仅改变当前引用指向,原始引用不变。字段为值类型:修改的是元素本身的值,会直接改变原始结构体的字段值。结构体字段若为非引用类型,赋值时传递的是副本,对副本的修改不影响原始字段。for range 循环中,迭代变量是集合元素的副本(类似函数传参的值传递),修改迭代变量不影响原始集合。
2025-08-03 13:48:17
1022
原创 Git看这一篇就够了(入职版)
Git 是开源的分布式版本控制系统,用于追踪文件修改、多人协作开发。git add 存到暂存git commit 提交到本地仓库git push 推送到远程仓库git staus 查看本地变化(暂存/未暂存)git log 查询提交变化(commit和push)
2025-07-26 12:35:03
1145
原创 Zap日志库使用看这一篇就够了
Zap 是一个用 Go 构建的,快速的 ,结构化,级别化的日志组件。默认的日志记录器 Logger和Zap对比标准库log实现方式:基于,使用反射和字符串拼接,性能较低。适用场景:简单应用或对性能要求不高的场景。非结构化:仅支持简单的文本拼接zap高性能设计无反射:通过强类型的 API(如)避免反射开销。零分配:核心组件使用预分配缓冲区,减少 GC 压力。Benchmarkzap的结构化日志比log快10-100 倍。非结构化日志(如)性能接近原生fmt。结构化日志。
2025-06-26 12:39:40
952
原创 Viper、Validator看这一篇就够了
直译为眼镜蛇,是一个针对 go 应用程序的完整的配置文件解决方案,可以处理几乎所有类型的配置需求和格式,方便管理项目的配置文件。简单来说就是管理配置文件。removeTopStruct(errs.Translate(trans))是清除前缀(可选)实现了一款基于结构体标签的值验证器。说简单就是一种对参数的校验机制。目前就上面的比较常用,如果有其他需求可以直接点击一级标题,有相关的文档说明。判断是否为校验错误 校验错误就可以翻译。
2025-06-23 21:58:03
895
原创 gomock看这一篇就够了
ps:这里的接口可以使用gomock在使用的时候进行接口的模拟实现这里举例一个person接口 包含eat和sleepstudent复用了person 包含name和personperson.gostudent.gore。
2025-06-19 16:52:48
1137
原创 docker-compose 部署常见的微服务中间件,看这一篇就够了
进入pluginsps:有的有一个文件 analysis-ik 我从本地找到了ik分词的文件复制到者 想要的可以私聊进入ik/config我新建了my.dic my_stop.dic 自定义分词和禁止分词文件【可参考其他已有的dic文件书写 其实就是每一行一个词】然后在IKAnalyzer.cfg.xml中添加生效重启容器生效!!参考文章四、redis五、zookeeper六、nacos。
2025-05-17 01:11:56
513
原创 学习记录:mybatis和jdbc实现数据表作为参数的相关的sql操作
1. 业务场景就是分表存储 然后查询id 确定表查;查询其他信息 融合所有表查询2. 有些看似简单的操作,第一做问题很多,比如这里的指定表插入;平时mp使用多了,都不太会写mybatis的xml以及想不到jdbc插入3. 说明一下xmlUser getUserByParam(Map<String, Object> params) 这样单个参数的 直接解析使用</select>这样多个参数的必须指定@Param 调用必须使用Param中参数获取 比如 user.nameVALUES。
2025-05-16 02:01:13
1042
原创 分布式锁redisson的中断操作
1、主动被中断 2、线程池提前关闭(这个常见点 比如线程池的shutdown和shutdownnow(强制关闭),线程被中断)3、用户操作(比如取消操作)1、第一次用,不熟悉redis、redisson和配置文件 以为只需要配置一个redis的ip和端口公用。虽然在普通的业务流程中可能较少遇到,但在高并发、需要精细控制资源的系统中,这种中断处理是必要的。的超时是由 Redisson 内部实现的,但如果在等待期间线程被外部中断,仍会抛出异常。为什么要写这个,因为中断异常会很常见。当其他线程调用当前线程的。
2025-05-12 00:35:57
1195
原创 算法:ACM模式输入、输出
1)当左右节点中存在最后一个节点结束【对于当前节点的右边叶子节点在上一层已经构建好了】2)避免左节点为最后一个节点 不能使用2*i+2判断 使用2*i+1 然后判断右节点。
2025-04-06 16:32:23
313
原创 深拷贝和浅拷贝
浅拷贝就只是拷贝了外部的对象 对于对象内部的引用对象还是用的原来的 这样就导致了修改拷贝对象的内部引用对象 导致原来对象的内部对象也改变。创建一个新对象,但不复制对象内部的引用指向的对象。复制的是对原始对象内存地址的引用。改变新对象内部的引用所指向的对象会影响原始对象。创建一个新对象,并递归地复制原始对象及其引用的所有对象。新对象和原始对象完全独立,修改一个不会影响另一个。简单讲:深拷贝相当于递归拷贝 对于其中的对象类型也进行拷贝新的 不用旧的。
2025-02-28 12:08:27
595
原创 Java 重写接口并注入重写父类(oauth2的登录流程)
3、因为在类DaoAuthenticationProvider中UserDetailsService是通过setter赋值的 而不是注入的方式 因此如果不该写setter 将新的实现类注入 就默认用旧版的 这样之前的逻辑就都失效了。一、重写了UserDetailService的loadUserByUserName 实现了密码校验以及用户信息扩展。三、将改写的接口实现注入到继承类中(否则 UserDeatil的实现类并不会生效)1:会从加载ioc中加载接口以及相关的实现类(已经注入了在第一步)
2025-02-27 18:40:06
312
原创 线程同步辅助类的使用
1、必须使用semaphore.acquire();否则线程数量不会被限制 和普通线程一样。2、如果不执行semaphore.release();线程永远占用一个数量。1、可以理解成countDown()一次就减一 直到0结束。1、调用一次await() 就加1 到达指定数量结束。3、最多指定数量的线程 执行完释放后 进入新的线程。线程池是线程不变 这里是位置不变 线程改变。
2025-02-26 22:57:01
303
原创 Java语法:重写第三方类的方法和第三方接口实现类的不同
这里以oauth2协议+springSecurity框架的账户密码和微信扫码登陆为例。一方面是密码登录改写UserDeatilService的实现方法loadUserByUsername();另一方面是改写类DaoAuthenticationProvider的方法additionalAuthenticationChecks()。
2025-02-26 12:52:17
350
原创 分布式锁基于数据库实现
实现分布式锁的方案有很多,常用的如下:1、基于数据库实现分布锁利用数据库主键唯一性的特点,或利用数据库唯一索引、行级锁的特点,多个线程同时去更新相同的记录,谁更新成功谁就抢到锁。2、基于redis实现锁redis提供了分布式锁的实现方案,比如:SETNX、set nx、redisson等。拿SETNX举例说明,SETNX命令的工作过程是去set一个不存在的key,多个线程去设置同一个key只会有一个线程设置成功,设置成功的的线程拿到锁。3、使用zookeeper实现。
2025-02-25 22:52:26
469
原创 Leecode刷题:209. 长度最小的子数组(ACM)
1)当水果有k+1种 不满足 =>缩=>当只有两种水果了=>扩 =>发现没有找到临界点满足【两种水果最大】2)由于求最大 因此可以记录所有满足条件的窗口求最大值 而求值最小 需要找刚好不满足的情况下的窗口+1。1) 滑动窗口 left=0 right=0 开始 left表示左端 right表示右端。1)首先一定要大于=>大于不一定是最小=>缩到刚好不满足=>当前窗口+1。2)while循环固定判断右端是否超出,未超出则加入窗口 (最后++)对比水果成篮 找最大的窗口。
2025-02-23 20:18:59
242
原创 Leecode刷题:443. 压缩字符串(ACM)
特殊的count>1 先记录count 然后重置count=1。所有新节点遇到就记录 然后更新count。1、双指针【记录不同节点】类似。2、记录次数[count记录]3、最后一个节点一定记录。
2025-02-23 19:28:11
208
原创 八股文实战之JUC:ArrayList不安全性
CopyOnWriteArrayList原理: 写入的时候(可能存在覆盖操作) =====>读写分离的思想(写入时复制一份给调用者 调用者写完 直接插入即可【防止写入时覆盖,造成数据问题】)lock锁。多个线程调用的时候(比如list),在读取的时候是固定的,但在写入的时候(可能存在覆盖操作)verctor原理:使用synchronized(效率低,因为只能允许一个线程操作)学习方案记录:1、先回用 2、货比三家、找不同解决方案 3、分析源码。源码:将整个列表复制一份然后插入数据 然后更新。
2025-02-22 22:16:18
343
原创 八股文实战之JUC:静态方法的锁和普通方法的锁
1、对于staic同步方法锁住的是class类模板(Class对象) 对象是线程(调用者) 调用者只有获取资源的锁才能调用。2、普通同步方法 锁住的资源是class对象 对象是线程(调用者)2、进程只有获取锁 才能访问锁对应的方法等资源。1、锁住的东西不同可以视作不同的锁。3、如果锁不同 就不存在锁竞争。
2025-02-22 21:25:19
248
原创 八股文实战之JUC:生产者消费者问题(虚假唤醒)
3)相应的wait和notify都需要修改成对应的对象,因为wait的目标是获取获取锁住对象的线程,即synchronized的对象的线程。1、对于wait需要使用while,防止虚假唤醒。1)常见的对于方法默认是实例对象this。2)如果不是this需要自己指定对象。
2025-02-22 19:55:27
331
原创 java语法:Mysql使用
而普通查询是获取表1的所有行去和整个表2的所有行比较where条件 因此更加复杂。普通连接查询(join)=内连接查询(inner join)left join 和 left outer join等价。返回所有数据 如何(左或右)不存在 则返回null。外连接(全连接) 返回所有 不存在返回null。左边数据一定返回 还会返回右边匹配的数据。内连接 没有左右内连接 内连接等同连接。左连接 等价 左外连接 (右同理)ps:左内连接/右内连接 不存在。区别是 内连接是先连接然后去查询。
2024-08-02 11:42:22
376
原创 java语法:雪花算法生成随机id
生成的字符串形式的 ID 更类似于 UUID(Universally Unique Identifier)的格式。ID 由时间戳、数据中心 ID、机器 ID 和序列号四部分组成,确保 ID 的唯一性。这是核心方法,用于生成全局唯一的 64 位长整型 ID。通常用于生成一些特定格式的编号,如订单号、商品编号等。方法生成 ID,并将其转换为字符串形式返回。方法生成 ID,并将其转换为字符串形式返回。返回值为 UUID 风格的字符串 ID。返回值为 ID 的字符串表示。返回值为长整型 ID。
2024-06-28 22:28:58
951
1
原创 js:flex弹性布局
第二轴是否拉伸以及如何排列 默认是拉伸 /* align-items: stretch;/* 区别两边间隔占0.5 中间间隔占1 */flex-direction: row-reverse;ps:相当于justify-content中间隔方式。ps:相当于justify-content中对齐方式。/* 所有间隔相等 *//* 起点对其 *//* 终点对齐*/第一轴如何排列(假设:设置的轴称为第一轴)设置轴线:横轴 不轴内逆转。换行/列 是否轴外逆转。
2024-05-31 14:50:36
1380
原创 java技术:mq消息队列
可以理解成接收器仍然是接收队列 只是将队列和相应的交换机绑定起来,同时给交换机设置属性。接收消息: 给交换机设置不同的属性blue,yellow。发送消息时也设置属性key。接收消息: 给交换机设置不同的属性通配符。发送消息时也设置属性key。(后面两种一样,设置相应交换机即可)只是key不同 这个为" "发送方将消息发送至交换机(其他三种都是如此发送)接收方只需要接收相应的队列(区别于其他两种)ps:上述的发送接收前提是创建好了队列。ps:创建交换机同时绑定队列。
2024-05-30 13:24:45
701
原创 python:pycharm虚拟解释器报错环境位置目录为空
如果选不了 查看项目路径是否带中文,如果没中文也不行,最好不要放桌面,放不带中文的一个盘下。虚拟解释器要选到虚拟解释器目录下python.exe。
2024-05-24 21:23:49
3039
原创 java网络:过滤器修改请求头
如oauth2的过滤器即使order值比较大 仍会先执行。基于HttpServletRequest。有时候存在使用@Order(1) 不生效。
2024-05-23 16:26:49
766
原创 java报错:Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gate
而gateway是包含spring-boot-starter-webflux这个包的 如果使用第一种 需要排除pring-boot-starter-webflux。1、上面的代码:基于spring-boot-starter-web。2、基于spring-boot-starter-webflux。上面是security的访问配置。
2024-05-22 21:26:17
1366
原创 java技术:全局异常处理器、常用枚举、以及字段赋值
ps:对于异常处理一般是throw new Exception(e),可以静态化输出。全局异常处理类处理不同的异常都返回异常类型RestErrorResponse。RestErrorResponse定义:(前端沟通定义)
2024-05-18 13:42:08
406
1
原创 java技术:spring-secrity实现认证、授权
加载security前会加载的过滤器 可设置校验的接口匹配 这里的.antMatchers("/**").anonymous()时放行所有 既所有接口都会进入auth校验。.antMatchers("/r/**").authenticated()//访问/r开始的请求需要认证通过。.antMatchers("/**").anonymous()//放行接口。
2024-05-18 10:53:09
1162
1
原创 java技术:aop切面
aop类型:@Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行@Before:前置通知,此注解标注的通知方法在目标方法前被执行@After :后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行@AfterReturning : 返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行@AfterThrowing : 异常后通知,此注解标注的通知方法发生异常后执行区别:Around()环绕通知 传参使用ProceedingJ
2024-05-06 09:56:07
644
原创 java报错:java.lang.IllegalStateException: Method has too many Body parameters
feign调用将参数指定。
2024-04-15 12:11:06
275
原创 gitignore:常用说明
/src则只会忽略同级目录下src文件夹及其内容 不包括子文件夹。文件中添加忽略该文件的规则,以防止将其重新添加到版本控制中。文件夹,但不包括子文件夹中的内容。都会被匹配,同时它们的子文件夹中的内容也会被忽略。文件夹及其子文件夹中的内容。不会被匹配,它的子文件夹中的内容不会被忽略。的文件夹,无论其所在的层级如何。的文件夹以及其子文件夹中的内容。3、提交并推送gitignore文件。:这个模式匹配任意层级的目录下的。:这个模式匹配任意层级的目录下的。或者直接在仓库删除(推荐),以忽略指定的文件。
2024-04-11 20:58:04
460
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅