自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

jiohfgj的博客

一个专注于分享的博客

  • 博客(196)
  • 资源 (2)
  • 收藏
  • 关注

转载 Golang - sync.map 设计思想和底层源码分析

本文转载自https://www.cnblogs.com/yinbiao/p/15838957.html本文Go版本:v1.14.4。

2023-05-06 17:07:36 319

原创 Golang-map底层原理刨析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yz8FjpJt-1683362716010)(https://gitee.com/cqfbest/md/raw/master/img2//v2-95697e3e2584722431ab1c37f3a61736_1440w.jpg)]Go 语言内置了 map 数据结构, map 的底层便是一个 HashTable, Go 语言的 map 的使用非常简易, 但其内部实现相对比较复杂, Go 语言的 Runtime 使用了多个数据结构

2023-05-06 16:45:53 1119 1

原创 Golang - slice 内部实现原理解析

在几乎所有的计算机语言中,数组的实现都是一段连续的内存空间,Go语言数组的实现也是如此,但是Go语言中的数组和C语言中数组还是有所不同的slice的出现,便是为了解决这个问题。

2023-05-06 16:06:10 634

原创 Golang之HTTP服务中间件设计(四)

中间件:将这些非业务逻辑代码抽象出来,封装好,提供接口给控制器使用装饰器模式:将最核心的代码一层层装饰,返回的时候一层层出来首先我们从之前的Controller开始,之前写了一个可以超时的controller但是那是写在了代码里,我们能不能变成中间件为我们自动去判断超时呢!首先在写下我们的中间件方法:但是这样的调用的话就变成了如果有新的中间件要包裹,那岂不是显示写出来会很长,一层一层的!而且这个实现,也只能为一个controller需要的时候去包裹一下,只是省了写多个超时的代码,但还是要自己显示的调用!

2022-07-09 12:04:34 734

原创 Golang之HTTP路由设计(三)

为什么要设计路由规则,路由规则是HTTP的请求按照一定的规则 ,匹配查找到对应的控制器并传递执行的逻辑!自己编写路由的话需要注意一下一共有几种路由!也就是像这样我们在去注册动手编写自己的路由在上一节中我们编写了自己的请求处理器,对应在里面加入我们的路由规则就好了!framework/group.go给我们的注册路由,加上分组,用group包装,这样对应我们在使用group时就会对应到不同的请求类型的方法了!并且在这一层给所有的注册地址统一加上group前缀地址!如何实现动态路由首先先定义好我们的

2022-07-08 17:06:08 850

原创 Golang-动手实现一个分布式注册中心

以一个日志微服务为例,将日志服务注册到注册中心展开!其实这一个日志类的功能就是有基本的写文件功能,然后就是注册一个http的接口去写日志进去log/Client.go提供给外部服务的接口,定义好日志的命名格式,来显示调用接口去使用已经注册好的日志接口并且返回状态主启动程序LogService启动服务,主要执行start方法,里面有细节实现服务注册与服务发现服务启动与注册service/service.go服务注册与发现registry/client.go注册服务的时候会连着心跳以及

2022-07-07 12:11:32 938 1

原创 Golang之HTTP服务超时控制(二)

因为上一篇提过,每次来一个请求,然后就会起一个那么导致的可能就是一个树形结构的请求图,底下节点在执行中如果发生了超时,那么就有协程会堆积,所以超时控制是有必要的,一般的实现都由一个顶层设计一个Context进行自顶向下传递,这样可以从一个地方去避免多处执行异常,对于Context的过多细节我不在这里一一阐述,有需要的我将单独出一篇关于Context的介绍,下面我们就来看一下源码是如何设计的:设计初衷最关注的两个点就是一个是如何主动结束下游,另一个是如何通知上游结束下游时前者利用 后者利用,后者需要不断监听

2022-07-06 16:54:11 1387 1

原创 Golang之HTTP分析与设计(一)

这个函数主要是判断本次http请求是否升级为https,接着创建文本的reader,和写文本的buffer,再进一步读取本次的请求数据!最后是调用关键的方法来处理本次请求!流程梳理上述大致调用的流程梳理完毕总结一下main.go后续再往自己的serverHttp方法里自定义补充处理请求逻辑!本文到此结束,欢迎收看下一篇~...

2022-07-06 16:50:06 556

原创 基于JavaWeb的学生成绩管理系统(可交期末作业)

基于jsp+servlet+bootstrap+jquery+jstl实现的学生成绩管理系统,项目包含课程信息、成绩查看、学生老师管理员登录、个人信息、成绩信息查询、学生管理、教师管理、成绩管理等模块。是你学习或者使用的不二选择。运行环境: jdk7(8) +tomcat7 (8) +mysql+eclipseIDE环境: Eclipse,IDEA都可以tomcat环境: Tomcat 7.x,8.x,9.x版本均可硬件环境: windows 7/8/10 1G内存以上技术框架: jsp+servle

2022-06-14 23:13:06 1038

原创 golang-defer核心原理

Golang-defer关键字底层原理和执行流程

2022-06-01 17:37:14 118

原创 javaweb学生信息管理系统 、学生选课管理系统(期末作业)

javaweb学生信息管理系统 、学生选课管理系统(期末作业)一、前言采用javaweb实现的学生管理系统,拥有学生和管理员两种身份,页面采用jsp,后台是采用javaweb的servlet.专门为初学javaweb的阶段所打造的项目!可以用来交期末作业等!二、项目技术数据库: Mysql8.0技 术: JavaWeb页 面: Jsp软 件: IDEA三、逻辑流程图四、项目截图学生部分页面截图管理员部分页面截图五、最后想要源码的可以私信

2022-05-12 09:23:43 1381

原创 记一次业务开发涉及到的千万数据查询优化

记一次业务开发涉及到的查询优化前言老王:最近业务挺多的啊!小李:对啊,最近这不是要上线了嘛!,业务就开始多了起来!老王:最近有写到好玩的业务嘛!小李:都是增删改查,哪有好玩的!老王:最近不是要你实现查询全服玩家的战力并且每个人都有一份对应战力区间的挑战列表吗?我感觉还挺有意思的,说一下怎么写的呗小李:哈哈哈我也没用什么好思路,就是异步多线程扫表,下面我讲一下具体实现的吧!需求全服玩家的战力并且每个人都有一份对应战力区间的挑战列表,不用实时更新,但需保存当时的玩家状态,每两天重置一遍列表!

2022-04-27 11:29:35 283

原创 centos8使用yum报错-error

centos8使用yum报错因为刚买的服务器发现只能选择centos8,没有7的版本让人很蛋疼,果然没用过的版本就会出现一些疑难杂症,这次是yum命令居然用不了了😓🧵先展示一下错误Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist原因  因为centOS8于2021年12月31日停止了源的服务,而现在时间是2022年2月

2022-04-02 09:12:33 2170

原创 腾讯云COS作为图床

腾讯云COS作为图床gitee防止外链访问了,也就是不再能作为图床继续使用了!目前是建议可以使用第三方存储对象去存储资源。这样就不再寄人篱下了,这里我已腾讯云为例,当然其他云也可以,当购买了腾讯云COS后,我们需要配置好我们的bucket桶和密钥!创建密钥点击进去再点击访问密钥,根据下图创建密钥:然后来到我们的【储存桶列表】,将存储桶名称、地域填入PicGo,域名为空即可记得设为默认图床,否则上传不会默认走腾讯云COS。接下来就是填写PicGo上的腾讯云COS参数:大功告成,如果

2022-03-31 09:34:55 806

原创 缓存行Cache Line 是个啥

缓存行Cache Line 是啥Cache Line :顾名思义叫做缓存行缓存行越大,局部空间效率越高,读取时间越慢!缓存行越小,局部空间效率越低,读取时间越快!总所周知,计算机将数据从主存读入Cache时,是把要读取数据附近的一部分数据都读取进来这样一次读取的一组数据就叫做CacheLine,每一级缓存中都能放很多的CacheLineMysql里面的存储引擎也是有磁盘预读的效果,比如innodb默认读16kb为一页,多余的数据读出来会保存住,因为下次读取它们的概率会比较大!多核CPU下

2022-01-06 09:08:04 12833 5

原创 职责链模式 GoLang实现

职责链模式 GoLang实现工欲善其事,必先利其器!职责链模式用于分离不同职责,并且动态组合相关职责。1. 需求实现一个工具能准确判断英雄能秒人的技能伤害!方便开挂时选择最优技能,直接秒人,有的英雄现如今只有三个技能,但也不排除之后重做会有四个技能,要求实现简单上手,易扩展!技能 2 进来了技能 2 满足条件释放 造成 9000 伤害技能 3 进来了技能 3 满足条件释放 造成 10000 伤害2021/12/31 15:26:31 技能1,伤害7000有点低不太行啊!推荐你换其他技能2

2021-12-31 15:47:04 539

原创 选项模式-Golang设计模式

选项模式-Golang设计模式tips:对结构体中的字段,会频繁变化、需要灵活配置、有默认值的场景,可能会用到 Option 模式。1.场景往简单来说,有下面这一个需求:如果创造了一个英雄,我想修改它的属性,怎么才能方便的去修改,包括之后新增的字段,如果不直接用结构体.字段的形式,保证了修改英雄属性的安全性,2021/12/30 09:30:52 英雄创造后属性为: &{1001 Default 1 1 map[]}2021/12/30 09:30:52 英雄魔改后属性为: &{

2021-12-30 09:37:22 584

原创 外观模式-Golang实现

外观模式-Golang实现1.模拟场景实现需求为玩家拥有多个英雄,在部署好英雄之后,只用点击进攻,不用关心每个英雄具体自己的攻击手段!2021/12/29 14:19:48 李信释放大招!2021/12/29 14:19:48 李白释放大招!外观模式(Facade),为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。2.代码实现2.1 Heropackage main// 实例化func NewHero() Hero{ ret

2021-12-29 14:35:08 289

原创 快速看懂GO实现协程池思路

如何用GO实现协程池1. 为什么需要协程池使用协程池的好处是减少在创建和销毁协程上所花的时间以及资源的开销,解决资源不足的问题。如果不使用协程池,有可能造成系统创建大量同类协程池而导致消耗完内存或者内存泄漏的问题。2. 使用协程池的优点 不用手动频繁的创建协程了 方便统一管理,只用管理池子就行了 提高响应速度,一有任务如果有刚执行完的协程就能马上去执行新任务3. 设计思路Task 任务对象->EntryChannel->JobsChannel <-Pool(worker

2021-11-07 19:31:51 492

原创 GO 快速学会使用反射

GO 快速学会使用反射1. 介绍在反射的世界里,我们拥有了获取一个对象的类型,属性及方法的能力。在 Go 反射的世界里,有两种类型非常重要,是整个反射的核心,在学习 reflect 包的使用时,先得学习下这两种类型:reflect.Typereflect.Value2. 方法示例2.1 通过反射获取对象的键(类型)和值package mainimport ( "fmt" "reflect")//func reflectNum(arg interface{}) {

2021-10-11 00:00:37 414

原创 go设计模式之美-创建型模式总结

go设计模式之美-创建型模式总结1. 概述​ 学习这些设计模式更多的是去考量和及时的总结,不是一味的套模板,思考创建对象时是否需要用到设计模式?又该需要哪一种设计模式更合适?我认为这些思想会是学习设计模式最重要的一个得到的东西,所以在此进行总结之前的几个创建型设计模式!2. 总结3. 复习的地址 单例模式饿汉式懒汉式 工厂模式简单工厂工厂方法抽象工厂 建造者模式 原型模式...

2021-10-10 22:44:32 141

原创 go设计模式之美-原型模式

go设计模式之美-原型模式1. 定义由于反复创建大量重复对象会造成效率损失,原型模式利用已有原型对象进行复制拷贝的方式来创建新对象,已达到节省创建时间的目的2. 需求项目启动时需要先将游戏的道具配置先加载到内存中每次更新游戏对象数据属性时,需要重新再次加载一遍游戏道具对象的属性数据必须来自同一版本,不能一部分数据来自版本一,更新的一部分来自版本二,所以需要将每次更新的数据全部深拷贝到内存中代码实现package prototypeimport ( "encoding/json"

2021-10-10 22:40:36 711

原创 go设计模式之美-建造者模式

go设计模式之美-建造者模式建造模式和工厂模式不同点建造模式用于创造参数复杂的对象,而工厂模式用于创建类型相关的不同对象1. 使用场景这个就非常重要了,因为如果你学了个东西,都不知道用来解决什么问题,你说有什么用?理解使用场景的的重要性要远高于你是不是会实现这个模式,因为只要你知道什么问题可以使用builder模式来解决,那你即使不会写,也可以在调查相关资料后完成。 我不想说一些大而正确的术语来把你搞蒙,我们只针对具体的问题,至于延展性的思考,随着你知识的增长,逐渐会明白的。延展阅读当一个类的

2021-10-09 09:45:14 196

原创 go设计模式之美 - 工厂模式

go设计模式之美 - 工厂模式1. 定义工厂模式是一种创建型设计模式,有了工厂只需要知道要制造的东西名字,就能让对应工厂进行生产,不用关心生产过程。2. 优点1、一个调用者想创建一个对象,只要知道其名称就可以了。2、扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。3、屏蔽产品的具体实现,调用者只关心产品的接口。3. 代码实现3.1 普通工厂package factorytype HeroFactory interface { Name(str string)}type W

2021-10-08 22:21:20 169

原创 go设计模式之美 - 单例模式

go设计模式之美 - 单例模式1. 定义一个类只允许创建一个对象或实例,那这个类就是一个单例类,这种设计模式就叫单例模式业务上某些数据只应该保存一份的就比较适合设计为单例类2. 前置知识sync.Once 是 Go 标准库提供的使函数只执行一次的实现,常应用于单例模式,例如初始化配置、保持数据库连接等。作用与 init 函数类似,但有区别。init 函数是当所在的 package 首次被加载时执行,若迟迟未被使用,则既浪费了内存,又延长了程序加载时间。sync.Once 可以在代码的任意

2021-10-08 16:14:29 151

原创 解锁快速上手NSQ的新姿势

解锁快速上手NSQ的新姿势1. 介绍​ NSQ是Go语言编写的,开源的分布式消息队列中间件,具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,同时支持横向扩展,操作友好,是一个成熟的、已在大规模生成环境下应用的产品。2. 消息中间件应用场景2.1 异步处理参照下图利用消息队列把业务流程中的非关键流程异步化,从而显著降低业务请求的响应时间。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jyt2j2X

2021-10-07 03:17:45 352

原创 Go 自己动手实现日志收集

Go 自己动手实现日志收集看日志是开发者平时排查BUG所必须的掌握的技能,但是日志是如何来的呢?通过平时开发者自己打日志,经过日志包进行处理,打印日志到控制台还是记录日志到文件中!下面咱就来学一下日志是如何记录下来的1. 日志器的接口​ 以下日志器定义了各类日志器的行为,通过RegisterWriter注册实现了日志器的子类日志器,然后通过Log方法来进行循环调用注册进来的日志收集器的write写日志方法。// 声明日志写入器接口type LogWriter interface

2021-10-04 18:54:04 542

原创 什么是Kubernetes

K8s-Kubernetes1.什么是Kubernetes​ Kubernetes是Google公司在2014年6月开源的一个容器集群管理系统,使用Go语言开发,也叫K8S。Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。**Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着(**比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动

2021-08-27 13:38:32 19462

原创 八分钟掌握GO实现LRU的核心思想

GO实现Redis的LRU例子常见的三种缓存淘汰算法有三种:FIFO,LRU和LFU实现LRU缓存淘汰算法1.FIFO/LFU/LRU 算法简介缓存全部存在内存中,内存是有限的,因此不可能无限制的添加数据,假定我们能够最大使用的内存为Max,那么在一个时间点之后,添加了某一条缓存记录之后,占用内存超过了N,这个时候就需要从缓存中移除一些数据,那么该移除或者淘汰谁呢?我们肯定希望去移除没用的数据,将热点数据留在缓存中,下面几种就是对应的几种策略!FIFO (First in First Out

2021-08-18 11:00:05 805

原创 sync.pool的好处在哪里

sync.pool的好处在哪里1.sync.pool的使用场景保存和复用临时对象,减少内存分配,降低 GC 压力。举个简单的例子:type Student struct { Name string Age int32 Remark [1024]byte}var buf, _ = json.Marshal(Student{Name: "Geektutu", Age: 25})func unmarsh() { stu := &Student{} json.Unm

2021-08-16 15:21:55 265

原创 git 修改远端分支

Git 修改远端分支相信很多人遇到过现有的项目修改仓库地址的情况有三种修改方式1、 修改命令git remote set-url origin url 2、 先删后加git remote rm origin //删除现在的仓库地址git remote add origin url //url为你要改的新地址3、直接修改config文件修改后如果git pull会提示fatal: refusing to merge unrel

2021-08-09 13:53:42 2467

原创 GO语言中计算字符串长度

GO语言中计算字符串长度在GO语言中计算计算字符串长度不能简单直接使用len函数,len函数获取的是字节,一旦字符串中拥有中文,而中文按照UTF-8的编码格式算一个中文算3个字节,那么计算的字符串长度就会和想法有出入,所以使用len计算字符串长度需要慎重考虑!那么我们该用什么来计算比较正确呢?utf8.RuneCountInString("str") //使用该函数计算中文和英文下面来实战演示一下func main(){ //打印len函数和utf8.RuneCountInString的计

2021-05-13 11:24:40 906

原创 The following untracked working tree files would be overwritten by merge:

原因分析翻译以下未跟踪的工作树文件将被合并覆盖本地有(gitignore)忽略的文件和分支上也有这个忽略文件 要拉取下来的,起了冲突解决办法清除本地文件,然后拉取分支上的然后接着pull就不会有错了.git clean 从你的工作目录中删除所有没有 tracked,没有被管理过的文件。clean用法详解参数说明:n :显示将要被删除的文件d :删除未被添加到 git 路径中的文件(将 .gitignore 文件标记的文件全部删除)f :强制运行x :删除没有被 track

2021-04-07 09:36:22 31721 4

原创 ProtoBuf协议到底是什么?

ProtoBuf协议到底是什么?工作中所使用的传输协议,下面就来一探究竟,为何众多协议选择了它?前言在移动互联网时代,手机流量、电量是最为有限的资源,而移动端的即时通讯应用无疑必须得直面这两点。解决流量过大的基本方法就是使用高度压缩的通信协议,而数据压缩后流量减小带来的自然结果也就是省电:因为大数据量的传输必然需要更久的网络操作、数据序列化及反序列化操作,这些都是电量消耗过快的根源当前即时通讯应用中最热门的通信协议无疑就是Google的Protobuf了,基于它的优秀表现,微信和手机QQ这样的主流

2021-03-23 11:14:37 997

原创 GO的Socket连接Demo

GO的Socket连接DemoGo实现客户端和服务器利用Socket交流Demo服务器端func main(){ fmt.Println("服务器开始监听..") listen,err :=net.Listen("tcp","0.0.0.0:8889") if err !=nil { fmt.Println("listen err=",err) return } defer listen.Close() for{ fmt.Println("等待客户端连接..") con

2020-12-01 18:33:01 553

原创 简单叙说http的要点

TCP/IP协议族按层次分别划分为:应用层,传输层,网络层和数据链路层层次划分应用层(http,ftp,dns)​ 决定了向用户提供应用服务时通信的活动传输层(tcp,udp)​ 提供处于网络连接中的两台计算机之间的数据传输网络层(ip)​ 选取合适的网络路径到对方计算机并把数据包传送给对方数据链路层​ 处理连接网络的硬件部分先是作为发送端的客户端在应用层发出一个想看某个Web页面的请求,H

2020-09-10 09:04:01 238

原创 双指针leetcode十五题

双指针leetcode十五题双指针:一般代表用多个指针指向不同得位置,通过指针得移动来解决问题得变动1.两数之和2-输入有序数组给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。输入: numbers = [2, 7, 11, 15], target = 9输出: [1,2]解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2

2020-08-31 17:56:08 274

原创 典型的几道数组题(leetcode easy)

典型的几道数组题(leetcode easy)1.多数元素给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。你可以假设数组是非空的,并且给定的数组总是存在多数元素输入: [2,2,1,1,1,2,2]输出: 2class Solution { public int majorityElement(int[] nums) { int count=1; int cand=nums[0]; for(i

2020-08-30 16:18:28 264

原创 秋招算法充分理解回溯(leetcode中级难度)

回溯 回溯法是一种探索所有潜在可能性找到解决方案的算法。如果当前方案不是正确的解决方案,或者不是最后一个正确的解决方案,则回溯法通过修改上一步的值继续寻找解决方案。17. 电话号码的字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].解法一 (DFS+剪枝)

2020-08-28 19:36:44 227 1

原创 秋招算法之leetcode动态规划(easy11题)

秋招算法之leetcode动态规划(easy11题)1.打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额class Solution { public int rob(int[] nums) { int len = nums.le

2020-08-26 20:10:15 398

peidong.rar

用go语言的框架gin,开发采用mvc思想,利用中间件做了jwt权限,跨域访问,异常封装

2021-10-02

springsecurity-0.0.1-SNAPSHOT.jar

打成了jar包,这个是Springboot+Spring Security整合的例子可以了解他们之间对角色的认证还有对权限的分配和拦截

2020-02-29

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除