- 博客(62)
- 收藏
- 关注
原创 git回退到指定版本
如果需要回到几次提交前可以在~后加上对应数字。如果有需要,可以在命令后指定需要更新的分支。git reset --hard 版本号。也可以通过强制提交来取代当前最新版本。回退后可以更新恢复当前版本。...
2022-08-28 12:34:24
347
原创 分布式事务
分布式事务的CAP和BASE理论Java基础之《分布式事务(2)—什么是分布式事务》_csj50的博客-CSDN博客_什么是java分布式事务
2022-07-06 15:36:28
159
原创 prepare
1.prepare stmt from xxx; //用于 词法分析->语法分析->语义分析 生成一棵语法树(Lex)2.execute stmt //执行sql3.deallocate prepare stmt; //清除mysql服务器内存中这颗语法树所占用内存。说白了,清除第1步。prepare 的目的,用于节省 词法分析->语法分析->语义分析 所占用的时间,因为每句普通的sql,比如 select xxx 或者 insert into xxx 都是要进行这些过程的。重复执行,而参数不
2022-06-20 17:22:13
327
原创 IO缓冲区
C 标准库IO缓冲区 内核缓冲区(一)_2> /dev/null-CSDN博客_io缓冲区IO缓冲区_syqnyue的博客-CSDN博客_io缓冲区
2022-01-04 10:55:19
81
原创 tcp三次握手抓包分析
参考:TCP三次握手wireshark抓包分析_牛仔的blog-CSDN博客_wiresharktcp三次握手4次挥手只能抓到3次包tcp retransmission :tcp重传tcp out-of-order:tcp乱序
2021-12-27 11:02:35
1169
原创 golang map设计思想
golang map的使用:参考:由浅入深聊聊Golang的map_咖啡色的羊驼-CSDN博客_golang mapgolang map的设计思想:参考:【Golang】Map长啥样儿?_哔哩哔哩_bilibili1.首先golang的map实际上就是一个hash表,首先按照key-value存储,对key进行哈希然后存到value中,如果value冲突了,就在相同位置新增一个链表,将新的value存储到链表中。2.key的定位根据key的的高8位对桶的数量进行哈希,然后分配到不同.
2021-12-26 19:43:53
211
原创 golang 两个nil不一定相等
参考:Golang: 什么时候nil != nil_MoFengLan的专栏-CSDN博客总结一下,就是一个一个interface的nile和一个*int类型的nil比较是否“==”时,需要比较类型和值。但是interface类型是在运行时确定类型的,随时会变。因此会出现两个nil不相等的情况。方便记忆,可以记为:interface被确定的赋值了,才会相等:如果interface被确定赋值为nil,那interface就与nil相等,但是与值为nil的*int不等;如果interface
2021-12-20 19:30:07
691
原创 go内存泄露
golang能够GC是程序声明的变量,而一些外部资源是不可以GC掉的,比如os.OpenFile打开的文件句柄,sql.Open打开的数据库连接句柄等资源。内存泄露,十次有九次都是goroutine泄露pprof实战实战Go内存泄露 - Go语言中文网 - Golang中文社区...
2021-12-20 18:45:14
469
原创 golang里面struct和map的比较
参考:Go语言 struct结构体 能比较么 == 或 !=_daima_caigou的博客-CSDN博客_go struct能不能比较golang key map 所有_Golang:map的比较-Go语言中文社区_weixin_29179583的博客-CSDN博客总结下,就是:map和slice这种不能直接用==操作符进行比较,要用refeltc.DeepEqual进行比较。对于struct,如果struct里面没有map、slice这种不能直接比较的,那这个struct就可以比较;
2021-12-20 17:51:22
624
原创 限制goroutine的数量
1.首先得知道,GOMAXPROCS指的是GMP调度模型中M的数量,一般情况下是和cpu的核数一致,可以显示的调用runtime.GOMAXPROCS来设置为最大的cpu核数,但是如果不调用,自动也会设置为这个值。所以GOMAXPROCS并不能设置最大并发的goroutine的数量2. goroutine的数量也不能无限制的变多,因为无限新增的话会耗尽资源。所以怎么解决呢?需要用协程池,但实际上协程池也是用channel来实现的。每次新增goroutine的时候写入channel,当channe
2021-12-20 17:28:08
828
原创 golang触发gc的时机
参考:Golang什么时候会触发GC - 简书总结一下,一共有主动和被动两种:主动就是:RD调用runtime.GC来触发,但是一般不会自己调被动就是分为两种:一种是搞一个定时器,定时来GC;一种是给内存搞一个上限,到达上限就自动触发。但是问题是,什么时候被动触发呢?一开始的思路是:在go框架或者公司内部平台配置的。但实际上是在go标准库里面搞的。具体代码位置是:/usr/local/Cellar/go/1.16.5/libexec/src/runtime/proc.go 里..
2021-12-20 16:44:18
1301
转载 golang减少gc的方法
参考:golang gc优化的几个点_boshuzhang的专栏-CSDN博客1,函数尽量不要返回map, slice对象, 这种频繁调用的函数会给gc 带来压力。 2,小对象要合并。 3,函数频繁创建的简单的对象,直接返回对象,效果比返回指针效果要好。 4,避不开,能用sync.Pool 就用,虽然有人说1.10 后不推荐使用sync.Pool,但是压测来看,确实还是用效果,堆累计分配大小能减少一半以上。 5,类型转换要注意,官方用法消耗特别大,推荐使用雨痕的...
2021-12-20 16:05:22
1166
原创 进程、线程和协程
参考:进程线程和协程 - Go语言中文网 - Golang中文社区写了一年golang,来聊聊进程、线程与协程 - 捉虫大师 - 博客园总结下,就是:进程:一个正在运行中的程序,就是一个进程,是操作系统可以分配的最小的资源分配单元。因为单个进程在执行io等操作时会阻塞,因此搞了多进程。但是多进程会涉及到切换进程的过程,这个过程中切换上下文需要耗费很多资源,所以搞了多线程。线程:一个进程可以有多个线程,且线程之间共享内存,所以线程间切换上下文的开销很小。但是在高并发的场景下,要
2021-12-20 15:46:29
367
原创 empty slice和nil slice的区别
(1)如果是var s1 []int这种 s1就是一个nil,没有被初始化(2)如果是 s1:=[]int{} s1 := make([]int,0),这种就只是一个empty slice,是完成了初始化的(3)经过测试,map和slice是一样的
2021-12-20 14:43:20
287
原创 golang中new和make的区别
(1)new返回的是指针,make返回的是对象的引用(2)new可以作用于所有类型,make只能作用于slice、map和channel(3)new只是分配了一块内存,并没有对对象进行初始化;make是分配内存的同时进行初始化
2021-12-20 14:42:46
200
原创 golang 内存逃逸
参考:Golang内存分配逃逸分析 - jimshi - 博客园GO语言变量逃逸分析 - Go语言中文网 - Golang中文社区总结下,就是:1. 堆和栈之前写c++的时候,栈是各种局部变量,函数结束就自动释放;堆就是使用new和malloc分配的,需要rd去关注啥时候分配,啥时候释放。在栈上分配内存比较快,而且回收也快,在堆上分配就耗费的资源比较多。而且,在栈上面分配的,函数结束后就自动回收了,只有全局的栈上的变量和堆上的变量,才需要GC回收,减少堆上分配内存的同时,也减轻了gc..
2021-12-18 22:37:40
610
原创 golang context
参考:Golang中 Context包深入浅出 - 简书简单总结下:1.为啥要用contextgo并发中,如果是简单地等待每个协程结束,就用waitGroup;如果是需要一个后台一直跑的协程(比如监控,启动的时候一直跑,等main结束时也结束),就可以用select+chan;如果需要多个goroutine进行一系列的负责的编排,就建议用context2.context(1)context的方法context主要是有几个方法:Done:判断context是不是被取消或者超时,
2021-12-18 19:33:37
399
原创 channel
1.go并发常用的方法并发分为两种,一种是数据共享,一种是将一个go的所有权交给另一个;(1).如果是简单的map、slice这种并发,可以用简单地加锁解锁来解决;(2).如果是简单的等所有goroutine协程都结束,可以用waitGroup(3) 如果是比较复杂的goroutine协程编排,需要用channel(4) 如果是和超时有关的,需要用channel和context2.会导致panic(1)close为nil的chan(2)往已经close的chan里面sen
2021-12-16 22:48:15
125
转载 垃圾回收-三色标记法
参考文档:Golang三色标记、混合写屏障GC模式图文全分析_混血王子的博客-CSDN博客_golang 三色标记法为什么堆会触发屏障,栈不会触发
2021-12-13 00:29:08
200
原创 垃圾回收-引用计数
垃圾回收共有3种1.一种是引用计数引用计数就是每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。引用计数的缺点是:(1)不能解决循环引用(2)会有并发的问题但是不能解决循环引用问题,循环引用如右边橙色的图:不能解决循环引用的原因是:class TestA{ public TestB b; }class TestB{ public TestA a; }public class Main{ public static v
2021-12-12 18:27:59
350
原创 对golang的Channel初始化的有缓存与无缓存解释
参考文章:对golang的Channel初始化的有缓存与无缓存解释 - Go语言中文网 - Golang中文社区这篇文章没看懂,简单说下就是channel初始化的时候,make了缓存长度的话,就是带缓存的,没有make长度,就是不带缓存的。带缓存的只要缓存没有满,往channel里面写东西和从channel里面读东西就都是异步的,不会被阻塞的。但是如果是不带缓存的,必须是发送的东西有人收到后才能继续下一次发送;或者是接受的东西必须收到后才能继续下一次的接受。func main() { jobs
2021-09-12 17:56:08
583
转载 读写锁重入导致死锁
参考:https://www.cnblogs.com/thinkeridea/p/10177781.html总结下,就是golang的读写锁是写优先的,如果同时有读锁和写锁去竞争,会优先给写锁;但是如果有已经获取到读锁的,写锁也会等已经获取的读锁执行完毕后再去竞争。文章里面举得例发生的场景就是,正在进行的读锁->竞争的写锁->竞争的读锁,最终导致的问题就是读写锁互相等待,导致死锁。...
2021-08-29 16:34:58
863
原创 gomock
这个是go的标准mock工具,适合写单测使用https://studygolang.com/articles/16801https://blog.csdn.net/xiaoliizi/article/details/107736758https://www.jianshu.com/p/598a11bbdafbhttps://geektutu.com/post/quick-gomock.htmlhttps://www.jianshu.com/p/598a11bbdafb...
2021-02-07 20:08:56
136
原创 golang string与其他类型转换
https://blog.csdn.net/whatday/article/details/1079183991.string与int类型转换string转成int: int, err := strconv.Atoi(string) string转成int64: int64, err := strconv.ParseInt(string, 10, 64) int转成string: string := strconv.Itoa(int) int64转成string: s.
2020-12-15 16:16:49
403
转载 url参数中有+、空格、=、%、&、#等特殊符号的问题解决
url出现了有+,空格,/,?,%,#,&,=等特殊符号的时候,可能在服务器端无法获得正确的参数值,如何是好?解决办法将这些字符转化成服务器可以识别的字符,对应关系如下:URL字符转义用其它字符替代吧,或用全角的。+ URL 中+号表示空格 %2B空格 URL中的空格可以用+号或者编码 %20/ 分隔目录和子目录 ...
2020-11-10 19:56:47
6221
转载 goland如何利用go fmt设置自动格式化代码写自定义目录标题
goland如何利用go fmt设置自动格式化代码写自定义目录标题设置方式设置方式https://jingyan.baidu.com/article/c45ad29c64cfe7051653e245.html
2020-11-10 19:54:18
553
原创 proto生成go文件
1.安装protoc工具下载protoc下载地址:https://github.com/protocolbuffers/protobuf/releases获取 Protobuf 编译器 protoc解压,把bin目录下的protoc复制到GOPATH/bin下,GOPATH/bin加入环境变量 2. 下载protoc-gen-go 下载命令:go g...
2019-12-28 16:01:09
2571
原创 Go语言类型转换和类型断言
Go语言类型转换和类型断言Go语言的类型转换和类型断言:类型转换在编译期完成,包括强制转换和隐式转换 类型断言在运行时确定,包括安全类型断言和非安全类型断言 Go语言要求不同类型之间必须做显式的类型转换。但似乎涉及到接口类型时,就会有所不同。//两种类型断言//不安全的类型断言,如果系统检测到不匹配,会在运行时调用内置的panic,抛出异常s := "abc"i := s.(...
2019-10-29 10:46:38
292
转载 static_cast, dynamic_cast, const_cast探讨
首先回顾一下C++类型转换:C++类型转换分为:隐式类型转换和显式类型转换第1部分. 隐式类型转换又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。 int ival = 3;double dval = 3.14159;
2016-03-09 16:41:43
201
转载 struct timespec 和 struct timeval
time()提供了秒级的精确度 .1、头文件 2、函数原型 time_t time(time_t * timer) 函数返回从TC1970-1-1 0:0:0开始到现在的秒数 用time()函数结合其他函数(如:localtime、gmtime、asctime、ctime)可以获得当前系统时间或是标准时间。如果需要更高的时间精确度,就需要struct timespec
2016-03-09 16:17:09
498
转载 struct timeval结构体 以及 gettimeofday()函数
一、struct timeval结构体struct timeval结构体在time.h中的定义为:struct timeval{__time_t tv_sec; /* Seconds. */__suseconds_t tv_usec; /* Microseconds. */};其中,tv_sec为Epoch到创建struct timeva
2016-03-09 15:51:02
486
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人