自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(69)
  • 收藏
  • 关注

原创 【踩坑记录】mysql caching_sha2_password‘ cannot be loaded问题解决

原因:8.0.19版本的mysq用户密码加密方式为caching_sha2_password,navicat暂不支持,需要修改下mysql的加密方式。解决办法:

2022-08-24 15:45:58 506

原创 如何生成全局唯一的id?

在开发过程中,我们有时候一些业务场景需要生成一个唯一的id,比如在商城下单的适合,我们要给订单生成一个唯一的id,再比如,我们使用分布式数据库的适合,我们需要保证全局的id是唯一的,那么这时候要保证我们数据的唯一性接下来看看两种常见的生成唯一id的方法。...

2022-07-25 18:02:23 2521 1

原创 Go语言新手容易犯下的错误

Gopher新手常犯的语法错误

2022-07-17 23:19:46 272

原创 GoWEB应用性能优化方法与套路

在了解性能优化之前,我们先来了解一下时间单位的换算从上图我们可以大概知道高速缓存、主存、SSD硬盘、还有硬盘的读写速度时间参考值和量级L1 cache reference是 1nsL2 cache reference是 4nsMain memory reference是100nsSSD random readreference是16000ns ≈ 16≈ 2 ms从上面五个数据来看,我们就能大概知道各种储设备的读写速度以及它们之间的量级之差首先,我们优化怎么先从大头开始优化,这样我们才能获得最大收益本篇文

2022-06-30 14:14:24 308

原创 Go并发编程之常见并发bug

注意:下述所有图片中 - 号是BUG代码,+号是修复BUG的代码goroutine1 ch发送者被阻塞住,无法释放锁goroutine2 loop获取锁失败 context.WithCancel内部启动goroutine,在ctx被覆盖后goroutin永久泄露使用WaitGroup一定要遵守的原则就是,等所有的Add方法调用之后再调用Wait,否则就可能导致panic或者不期望的结果 关闭已经关闭的channel会导致panic,因此在并发编程中要处理好channel的关闭这个bug无法被recover

2022-06-29 23:12:35 614

原创 Go并发编程之内置数据结构

声明对象池,只需要实现 New 函数即可。对象池中没有对象时,将会调用 New 函数创建。 用于从对象池中获取对象,因为返回值是 ,因此需要类型转换。 则是在对象使用完毕后,返回对象池。 Go语言中sync库提供了两种锁互斥锁(sync.Mutex)和读写锁(sync.RWMutex)互斥锁,互斥即不可同时运行。即使用了互斥锁的两个代码片段互相排斥,只有其中一个代码片段执行完成后,另一个才能执行。Go 标准库中提供了 sync.Mutex 互斥锁类型及其两个方法:读写锁,分为读锁和

2022-06-29 21:54:47 334

原创 Go语言之channel实现原理

在写代码的时候,我们很多时候都会用到channel,但是channel是如何实现的呢?基于上一篇文章Go语法实现分析之chan、go func、类型转换_程序员红豆的博客-CSDN博客声明、初始化代码,我们都懂,但是它背后是怎么实现的呢?https://blog.csdn.net/qq_37186127/article/details/125521611我们来分析分析channel的实现我们先看chan.go的hchan结构qcount:channel当前的数据总数dataqsiz:channel的大

2022-06-29 17:08:09 670

原创 Go语法实现分析之chan、go func、类型转换

声明、初始化代码,我们都懂,但是它背后是怎么实现的呢?

2022-06-29 15:36:31 483

原创 Go语言语法分析之我想打同事的脸--编译

不知道你有没有遇到这种情况,同事和你争执,非要说左边的代码要比右边的快,因为左边的少写了一行代码,这时你心生不忿但又无力反驳,只好忍气吞声那这边文章我们就来打他的脸我们先来看一下我们日常写代码的日常过程我们写完的代码最终会变成一个 hello 的二进制可执行文件 只要我们编译的时候得到的结果是一样的,我们就可以堵住同事的嘴我们分别对上述的代码进行编译left.go right.go 我们对比两个编译结果可以发现,其实它们是没有区别的,因此我们就可以知道它们的运行效率是一样的本文完~.

2022-06-29 14:34:30 82

原创 Go是如何处理goroutine阻塞的?

当我们在go func{}下有如何代码的时候,Go是如何处理阻塞的?注:阻塞情况还有其它情况比如 加锁,网络连接读/写,select 我们需要知道在Go中代码的执行是需要线程(M)绑定 P 才能在CPU上执行如果不知道什么是GMP,可以先阅读【GMP】当我写下go func的时候,到底发生了什么?_程序员红豆的博客-CSDN博客我们先理解什么是G、M、PG∶goroutine,一个计算任务。由需要执行的代码和其上下文组成,上下文包括∶当前代码位置,栈顶、栈底地址,状态等。M∶ machine,系统线程,执行

2022-06-29 14:00:27 1763

原创 【GMP】写下go func的时候,到底发生了什么?

我们先理解什么是G、M、PG∶goroutine,一个计算任务。由需要执行的代码和其上下文组成,上下文包括∶当前代码位置,栈顶、栈底地址,状态等。M∶ machine,系统线程,执行实体,想要在CPU上执行代码,必须有线程,与C语言中的线程相同,通过系统调用 clone 来创建。P:processor,虚拟处理器,M必须获得P才能执行代码,否则必须陷入休眠(后台监控线程除外),你也可以将其理解为一种 token,有这个 token,才有在物理 CPU核心上执行的权力。Go的调度流程本质上是一个生产-消

2022-06-29 12:19:50 686

原创 Go程序是如何运行起来的?

我们都知道我们执行下面命令会生成一个二进制可执行文件 但是当我们执行hello时,Go程序是如何执行的呢? 接下来的工具工具都打包在Docker images里了,大家可以自行实践我们先了解一下Go程序的编译 hello.go 的过程 上面三幅图第一幅是我们程序的代码第二幅是执行程序编译第三幅是多出了一个可执行的二进制 hello 文件 通过entry point 找到Go程序的执行入口,使用readelf 以上述为例子,执行了readelf -h ./hello命令 我们可以看到ELF Header

2022-06-29 11:21:32 2121

原创 设计模式-建造者模式

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作何时使用:一些基本部件不会变,而其组合经常变化的时候。优点: 1、建造者独立,易扩展。 2、便于控制细节风险。缺点: 1、产品必须有共同点,范围有限制。使用场景:1、需要生成的对象具有复杂的内部结构。2、需要生成的对象内部属性本身相互依赖。注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序type Compute

2022-04-14 22:15:14 288

原创 设计模式-装饰器模式

意图:动态地给一个对象添加一些额外的职责。如何解决:将具体功能职责划分,同时继承装饰者模式。优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。缺点:多层装饰比较复杂。使用场景: 1、扩展一个对象的功能。 2、动态增加功能,动态撤销。type Person struct { Name string}func (p *Person) show() { if p == nil { return } fm

2022-04-14 21:06:06 149

原创 设计模式-工厂模式

在工厂模式中,不会对外部暴露创建对象的逻辑,通过使用接口来指向新创建的对象。意图:定义一个创建对象的接口,工厂模式使创建对象过程对外部隐蔽。主要解决:主要解决接口选择的问题。何时使用:明确地计划不同条件下创建不同实例时。如何解决:让其子类实现工厂接口,返回的也是一个抽象的产品。关键代码:创建对象过程在工厂中完成。优点:1、一个调用者想创建一个对象,只要知道其名称就可以了。2、扩展性高,如果想增加一个产品,只要扩展一个工厂就可以。3、屏蔽产品的具体实现,调用者只关心产品的.

2022-04-13 10:31:12 66

原创 Win10系统升级,1804->21H2

本来打算把操作系统从Win10升级到Win11,但是没想到系统对硬件要要求但是目前的系统版本过于老旧,想升级系统又不想去重装系统因为重装系统又要重新安装一大堆软件,非常的耗精力

2022-04-13 09:52:08 2308

原创 wsl Error: 0x80070003

Windows Subsystem for Linux(简称WSL)是一个在Windows 10上能够运行原生Linux二进制可执行文件(ELF格式)的兼容层。它是由微软与Canonical公司合作开发,其目标是使纯正的Ubuntu、Debian等映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。打算尝试使用下Win10下的Liunx系统按照网上的步骤开启->MicroSoft Store下载Ubuntu20.04启动的时候报Error: 0x800.

2022-04-13 00:21:03 2668

原创 什么是依赖注入?DI

容器(Container) 管理对象的生成、资源取得、销毁等生命周期 建立对象与对象之间的依赖关系 启动容器后,所有对象直接取用,不用编写任何一行代码来产生对象,或是建立对象之间的依赖关系。 依赖注入容器 Dependency Injection Container 管理应用程序中的『全局』对象(包括实例化、处理依赖关系)。 可以延时加载对象(仅用到时才创建对象)。 促进编写可重用、可测试和松耦合的代码。 type Di struct { di

2022-04-11 16:15:10 69

原创 什么是依赖反转?IoC

控制反转 Inversion of Control是依赖关系的转移,依赖抽象而非具体先来看依赖具体的代码func main() { b := Bussiness{} b.save()}type Bussiness struct { FloppyWriter}type FloppyWriter struct {}func (b Bussiness) save() { b.saveToDevice()}func (f *FloppyWriter) saveToD..

2022-04-11 15:20:14 190

原创 设计模式-单例模式

目的:保证一个类仅有一个实例,并提供一个访问它的全局访问点。主要解决:一个全局使用的对象频繁地创建与销毁。何时使用:需要控制实例数目,节省系统资源的时候。如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。优点:1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例 2、避免对资源的多重占用(比如写文件操作)。使用场景:1、计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 2、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连

2022-04-11 14:56:47 800

原创 Rabbitmq知识总结

AMQP 是应用层协议的一个开放标准,为面向消息的中间件设计。 基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。 目标是实现一种在全行业广泛使用的标准消息中间件技术,以便降低企业和系统集成的开销,并且向大众提供工业级的集成服务。 主要实现有 RabbitMQ。常见问题Rabbitmq的四个部分->生产者、交换器、队列、消费者生产者:消息的创建者,发送到rabbitmq交换器:用于消息的分发队列:用于存放消息的队列消费者:连接到

2022-04-09 14:03:04 1541

原创 Redis知识总结

数据类型基础类型字符串(String):存储一个数值、字符串哈希表(Hash):存储多个键值对之间的映射 各不相同的键无序排列列表(List):可以有序地存储多个字符串(可重复) 有序 值可重复集合(Set):无序存储多个字符串 无序 值不可重复有序集合(Zset):存储键值对 键被称成员 成员各不相同 值被称分值必须为浮点数 可根据成员或分值、分值排序来访问元素的结构 根据相关的分值排序HyperloglogGeobitmap扩展类型/功能布隆过滤器限流

2022-04-09 12:57:14 744

原创 makefile入门

什么是makefile?Make 是一个构建自动化工具,如果存在Makefile 或 makefile 文件,会依据 Makefile 的构建规则去完成构建makefile.PHONY: build clean lint helpall: build lint clean helpbuild: @echo "build"lint: @echo "lint"clean: @echo "clean"help: @echo "help" echo "help"

2022-04-09 10:22:39 330

原创 【Go语言陷阱】方法值接收器的方法不能改变原始值?

别人提钱回家,我提前回家!

2022-01-21 14:14:47 314

原创 【Go语言陷阱】遍历map无法顺序输出?

场景我们来看下面这段代码,你认为它的输出结果会是什么?func main() { m := map[int]string{ 1: "one", 2: "two", 3: "three", 4: "four"} for k, v := range m { fmt.Println(k, v) }}预期的输出结果1 one2 two3 three4 four我们通常认为遍历都是有顺序的输出的但在Go语言中,..

2022-01-18 13:45:17 397

原创 【Go语言陷阱】结构体未导出的字段无法被编解码

我们来看一段代码你觉得14、17、22行的输出分别是什么?import ( "encoding/json" "fmt")type Data struct { One int two string three int}func main() { in := Data{1, "two", 3} fmt.Printf("%#v\n", in) encoded, _ := json.Marshal(in) fmt.Println(string(e

2022-01-04 21:36:27 483

原创 【Go语言陷阱】你可能想不到的字符串长度

在Go语言中,我们要统计字符串中字符的个数,我们肯定会想到用utf8.RuneCountInString()但是,这里我们可能会碰到一个陷阱我们来看一段代码func main() { data := "我"println(utf8.RuneCountInString(data)) data = "é"println(utf8.RuneCountInString(data))}在第3行代码中,输出结果是1,我相信大家都能想得到在第6行代码中,你是否会觉得它会输出是...

2021-12-24 15:42:36 226

原创 Mongodb数据类型的Int与String的查询语句

文档查询count=99999(整型) 和 count=“99999” (字符串类型)都只能查出对应类型的数据

2019-06-19 17:13:26 2713

原创 Mongodb中count($condition)查询非常慢?

问题最近项目中有使用到MongoDb,但是发现接口的速度异常的缓慢,最终定位到是Mongodb count()查询的问题count()带条件的情况下的查询时间16s(这是我本地的测试环境性能较差,线上的服务器8核16G内存大概需要1.6s左右)解决办法 添加索引 修改查询语句,并命中索引索引不能被查询使用:$regex,$nin, $not, $mod, $where 子句集合...

2019-06-19 11:14:30 11958

原创 Go的panic和recover与错误处理

panic停止当前函数执行一直向上返回,执行每一层的defer如果没有遇见recover,程序退出func writeFile(filename string) { file, err := os.OpenFile(filename, os.O_EXCL|os.O_CREATE|os.O_WRONLY, 0666) if err != nil { if pathError, ...

2019-05-04 10:57:01 207

原创 Go的defer

defer相当于一个栈防止中间returndefer确保在调用函数结束时发生参数在defer语句时计算 for i := 0; i < 100; i++ { defer fmt.Println(i) if i == 30 { // Uncomment panic to see // how it works with defer // panic("prin...

2019-05-04 10:37:02 189

原创 GO协程(goroutine)的使用

协程是什么?协程是轻量级线程 非抢占式多任务处理,由协程主动交出控制权非抢占式:计算机资源是由CPU控制调度,程序的执行由CPU控制,一个执行中的程序时间到了或者进行了I/O等阻塞操作系统会挂起该程序等待下一个时间分片再执行 编译器/解释器/虚拟机层面的多任务—操作系统层面只有线程它还没有协程 一个线程可有一个goroutine或者多个goroutine,这有GO的调度器决定。同时要记...

2019-05-04 01:07:41 843

原创 创建属于自己的第一个composer包

仓库地址:https://github.com/ngyhd/ngyhdPackagist地址:https://packagist.org/packages/ngyhd/ngyhd#dev-mastergithub创建仓库git init创建src文件夹并在目录下添加代码添加composer.json文件{ "name": "ngyhd/ngyhd", "type": "yii2-extension", "description": "The

2019-05-04 00:26:41 172

原创 nginx 502 bad gateway

NGINX下的CONF配置fastcgi_pass 确保与/etc/php5/fpm/pool.d/www.conf的文件下的listen配置一致配置完毕重启服务sudo service php5-fpm restartsudo service nginx restart

2019-05-04 00:23:34 73

原创 redis客户端连接(error) NOAUTH Authentication required

查看redis.conf文件搜索配置项输入/requirepass修改配置项为requirepass 123456./redis-cli -h 127.0.0.1 -p 6379 -a 123456

2018-10-11 11:09:04 960

原创 Redis远程连接不上问题

修改配置文件#绑定的主机地址bind=127.0.0.1修改为bind=0.0.0.0重启Redis0.0.0.0 表示监听所有IP地址,一台服务器可能同时有多个IP,如127.0.0.1本地回环IP、192.168.1.100局域网IP、210.127.20.2 外网IP…...

2018-10-11 11:04:47 810

原创 面向对象常见关键字

final class Demo //类名{ static public $param1; //成员属性 private $param2; //成员属性 protected $param3; //成员属性 const DEMO 10; //常量 public fucntion demo () { echo $this-&gt;param3; echo self::DEMO...

2018-09-26 15:28:30 280

原创 正则表达式

正则表达式的构成/原子 元字符/模式修正符1.定界符 // 2.原子 打印字符和非打印字符(\r \f)3.元字符 用来修饰原子4.模式修正符 放在定界符外边的字符,一个字符就是一个功能,可以组合使用1.原子1.打印字符 键盘上的字符都是打印字符 2.非打印字符 原子字符 含义描述 \cx 匹配由x指明的控制字符。如\cM匹配...

2018-08-09 17:50:36 101

原创 名字空间

定义命名空间–一般与文件夹命名一致namespace ngyhd/ngyhd;使用命名空间完全限定命名空间namespace test/test;use ngyhd/ngyhd;不完全限定namespace ngyhd;use ngyhd;不限定namespace...

2018-08-09 11:59:01 101

原创 PHP的魔术方法与魔术常量

魔术常量__LINE__ 文件中的当前行号。 __FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名 __DIR__ 文件所在的目录。除非是根目录,否则目录中名不包括末尾的斜杠。__FUNCTION__ 返回该函数被定义时的名字(区分大小写)。__CLASS__ 返回该类被定义时的名字(区分大小写)。__TRAIT__ 常量返...

2018-08-09 11:48:45 109

空空如也

空空如也

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

TA关注的人

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