自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 实现异步的日志库输出

需求分析:1.支持往不同的地方输出日志(终端还是指定的文件)2.日志分级别(DEBUG,WANRING,ERROR…)3.支持开关控制,能设置某级别以上日志才输出4.完整的日志要有时间,行号,文件名,日志级别,日志信息。5.日志文件要切割(按文件大小或者日期切割)func main() { logger := logfile.NewFileLogger("DEBUG","D:/","guoyilin",1*1024) name := "郭10" for { l

2021-03-15 22:38:57 366

原创 Golang的GMP内存模型和可视化调试(三)

1.go func()执行分析2.调度器的生命周期M0M0是启动程序后的编号为0的主线程,M0负责执行初始化操作和启动第一个G(初始化一些队列信息等),在之后M0就和其他的M一样了。G0G0是每次启动一个M都会第一个创建的gourtine,G0仅用于负责调度的G,G0不指向任何可执行的函数, 每个M都会有一个自己的G0runtime创建最初的线程m0和goroutine g0,并把2者关联。调度器初始化:初始化m0、栈、垃圾回收,以及创建和初始化由GOMAXPROCS个P构成的P列

2021-05-05 21:20:41 392 1

原创 Golang的GMP内存模型(二)

调度器的设计策略1 .复用线程避免频繁的创建、销毁线程,而是对线程的复用。1)work stealing机制当本线程无可运行的G时,尝试从其他线程绑定的P偷取G,而不是销毁线程。G1会单独和M1绑定,如果G1一直不执行,M1会被睡眠或者销毁。等待G1需要执行再加入本地队列。2. 利用并行GOMAXPROCS设置P的数量,最多有GOMAXPROCS个线程分布在多个CPU上同时运行。GOMAXPROCS也限制了并发的程度,比如GOMAXPROCS = 核数/2,则最多利用了一半的CPU核进行

2021-05-05 21:13:00 213

原创 Golang的GMP内存模型(一)

1.调度器的由来1.早期的单进程操作系统缺点:单一执行流程、计算机只能一个一个业务处理​ 进程阻塞所带来的CPU浪费时间2.多进程/多线程操作系统解决了阻塞问题,CPU轮询,进程切换需要保存状态,造成了巨大的时间浪费面临的问题是 线程越多,不停的切换轮询CPU,代价越大。所以在语言层面,让多个协程(任务绑定在一个线程内完成,可以减少线程切换)N:1 带来的问题是 如果一个协程阻塞,同一个线程绑定的下一个协程就会持续等待M:N 模型化解了问题,如果一个协程阻塞,可以绑定到下一个线程

2021-05-05 21:07:42 620

原创 Golang中defer的执行时机

1.defer的执行顺序底层是采用栈func func1() { fmt.Println("A")}func func2() { fmt.Println("B")}func func3() { fmt.Println("C")}func main() { defer func1() defer func2() defer func3()}输出 C B A2.defer和return 的顺序在Go语言的函数中return语句在底层并不是原子操作,它分为给返

2021-05-04 23:21:39 1562

原创 Golang互斥锁和读写锁的性能差异

1.互斥锁互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个goroutine可以访问共享资源。Go语言中使用sync包的Mutex类型来实现互斥锁。 使用互斥锁来修复上面代码的问题:var x int64var wg sync.WaitGroupvar lock sync.Mutexfunc add() { for i := 0; i < 50000; i++ { lock.Lock() // 加锁 x = x + 1 lock.Unlock() // 解锁

2021-05-01 11:00:52 739

原创 docker 镜像构建上下文理解

1.Dockerfile 中上下文的理解利用Dockerfile build镜像的时候 末尾总是有一个 .. 表示当前目录,而 Dockerfile就在当前目录首先要说明一下docker build 的工作原理。 引用百度的一段话:Docker是cs架构,也就是docker在运行时分为服务端(docker引擎)和客户端。用户在客户端所输入的一系列以docker开头的命令都是在通过一组RestAPI在远程与docker引擎交互。因此,虽然看起来我们是在本地直接操作docker,但是其实质是在远程调用并

2021-04-24 11:39:02 750

原创 MySQL数据库四种隔离级别的演示

1.事务之间的隔离性第一级别:读未提交(read uncommitted)数据在内存当中,没还没有写入硬盘,极其不稳定,如果断电数据将会丢失。​ 对方事务还没有提交,我们当前事务可以读取到对方未提交的数据。​ 读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。(事务一开启后,事务二尽管没有commit,事务一都能读到事务二修改的数据。)第二级别:读已提交(read committed)对方事务提交之后的数据我方可以读取到。这种隔离级别解决了: 脏读现象没有了。

2021-04-14 14:26:32 243

原创 Mysql索引底层B+树的实现原理以及Innodb和Myisam引擎存储的区别

1.如何创建索引通过SQL语句或者Navicat上直接创建创建索引对象: create index 索引名称 on 表名(字段名);删除索引对象: drop index 索引名称 on 表名;首先要明白,主键和带有unique字段的系统默认添加索引。但是对于普通字段,select 的时候需要全盘查找,这对于数据量大的情况下是不可接受的对于我的emp 表(一共15条数据)如下,如果我要查找sal(工资) =5000的情况。借助explain 看SQL底层的执行情况。如果不添加索引,

2021-04-10 12:30:55 315

原创 MySQL中drop、truncate和delete的区别?

delete是DML语句,可以选择删除部分数据,也可以选择删除全部数据;删除的数据可以回滚;不会释放空间(相当于表的格子都在,物理内存没有释放,只是数据抹去)drop是DDL语句,删除表结构和所有数据,同时删除表结构所依赖的约束、触发器和索引;删除的数据无法回滚;会释放空间truncate是DDL语句,删除表的所有数据,不能删除表的部分数据,也不能删除表的结构;删除的数据无法回滚;会释放空间(相当于表的表头都在,下面的表格全部丢弃)执行速度:一般来说:drop>truncate>delet

2021-04-05 16:54:46 228

原创 Golang操作MySQL

1.连接Go语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,并不提供具体的数据库驱动。使用database/sql包时必须注入(至少)一个数据库驱动。我们常用的数据库基本上都有完整的第三方实现。1.下载依赖go get -u github.com/go-sql-driver/mysqlfunc Open(driverName, dataSourceName string) (*DB, error)Open打开一个dirverName指定的数据库,dataSour

2021-03-25 13:40:11 446

原创 网络编程(tcp,udp,http)

1.Go语言实现TCP通信一个TCP服务端可以同时连接很多个客户端,例如世界各地的用户使用自己电脑上的浏览器访问淘宝网。因为Go语言中创建多个goroutine实现并发非常方便和高效,所以我们可以每建立一次链接就创建一个goroutine去处理。TCP服务端程序的处理流程:监听端口接收客户端请求建立链接创建goroutine处理链接。我们使用Go语言的net包实现的TCP服务端代码如下:func process (coon net.Conn){ for { //3.与客

2021-03-23 11:53:56 256

原创 Go mod包管理摒弃传统的Go Path开发

在 Golang1.11版本之前如果我们要自定义包的话必须把项目放在 GOPATH 目录。Go1.11版本之后无需手动配置环境变量,使用 go mod 管理项目,也不需要非得把项目放到 GOPATH指定目录下,你可以在你磁盘的任何位置新建一个项目 , Go1.13以后可以彻底不要 GOPATH了。Modules和传统的GOPATH不同,不需要包含例如src,bin这样的子目录,一个源代码目录甚至是空目录都可以作为Modules,只要其中包含有go.mod文件。如何使用go.mod?1.首先将go的版

2021-03-18 10:36:50 716

原创 并发编程

18. 并发编程1.生成随机数func main() { rand.Seed(time.Now().UnixNano()) 距离1970年的纳秒数 for i:=0;i<5 ;i++ { r1 :=rand.Int() //生成int64的值 r2 :=rand.Intn(10) fmt.Println(r1,r2) }}如果没有随机数种子,每次程序生成的都是5个同样的随机数,因为go bulid的时候已经生成好了,

2021-03-14 15:46:28 282

空空如也

空空如也

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

TA关注的人

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