- 博客(65)
- 收藏
- 关注
原创 PHP 8.5 垃圾回收改进
PR 标题说优化适用于 “枚举和静态伪闭包”。静态伪闭包显然是更常见的情况,而且术语与用户层面的命名不一致,我们来深入了解一下:什么是 “静态伪闭包”?上面的例子使用了” 静态伪闭包”,在用户层面通常称为”first-class callable”。在这个例子中,就是 foo(…)。
2025-12-19 17:29:02
462
原创 MySQL产生死锁的根本原因及解决方法
优化后该语句执行计划如下:优化后的执行计划使用了索引查找,将大幅提升该查询语句的性能,降低了锁定资源的时间,同时也减少了锁定资源的范围,这样就降低了锁资源循环等待事件发生的概率,对于预防死锁的发生会有一定的作用。一个进程被杀死,它的事务被取消,它的锁被释放,死锁中涉及到的另一个进程就可以完成它的工作并释放锁,所以就不具备产生另一个死锁的条件了。而语句1则获取了1686247页上的更新锁在等待1689766页上的更新锁,两个语句等待的资源形成了一个环路,造成死锁。2. 对语句更新的相关字段建立包含索引。
2024-03-08 09:34:00
1171
原创 mysql中select、from、where、group by、having、order by 、limit执行顺序
【代码】mysql中select、from、where、group by、having、order by 、limit执行顺序。
2024-03-07 11:13:46
1027
原创 关于php原生开发与主流php框架使用心得
本人是主要做php项目的,以前是从来不屑于用框架的,由于项目原因,这几年对比较流行的框架,都涉猎了一下,毕竟甲方是老大,人家制定让用什么,你必须要用,有时候你可以劝他们改变初衷,但有时候你只能遵从或者放弃,…至于因为这点原因放弃,那是不可能的,不过好在硬着头皮用了一遍之后,发现在开发效率方面确是大大提高。现在就谈一下我的一点感受。
2024-03-04 17:50:31
1379
原创 mysql优化
1.找到项目中的慢查询sql,设置一条sql语句查询超时多少秒就属于慢查询,然后将其记录到日志系统2. 使用explain分析每一条慢查询语句的性能:查询的序列号:查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。
2024-02-27 12:09:16
906
原创 Go的CSP并发模型实现M, P, G简介
G: goroutine(协程,也叫用户态线程)M: 工作线程(内核态线程)P: 上下文(也可以认为是cpu,逻辑cpu数量,可以在程序启动的时候设置这个数量,gomaxprocs函数设置)
2024-02-26 10:44:39
1161
1
原创 Go Module常用命令
go module是go官方自带的go依赖管理库,在1.13版本正式推荐使用go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等使用go module之后我们可不用将代码放置在src下了。
2024-02-24 23:32:35
1081
1
原创 五分钟带你了解啥是JWT
1. JSON Web Token是什么JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。该信息可以被验证和信任,因为它是数字签名的。2. 什么时候你应该用JSON Web Token下列场景中使用JSON Web Token是很有用的:2.1: Authorization (授权) : 这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资
2022-04-20 17:38:31
227
原创 golang 第三方包的选择方式
当开发一个项目的某一个功能的时候,需要使用到当三方的package,在GitHub上面找的时候相同功能的package有很多个,这个时候以什么方式来帮助我们选择使用那个包呢?star 数越多越好issue 数越低越好项目维护活跃,最后更新日期越接近越好有清楚的版本区分(查看项目的 Releases 标签)...
2021-02-03 21:35:34
286
原创 Go Modules 日常使用
1.初始化go mod init2. Go Proxy因国内访问外网受限,一般我们都会配合 Go Proxy 使用,以防止使用 go get 获取源码包时花费时间过长或无法下载:go env -w GOPROXY=https://goproxy.cn3.go.mod每一次的 go get 都会同时修改 go.mod 和 go.sum 文件。这两个文件是下载依赖包的主要依据。go.mod 类似于 PHP 中的 composer.json ,而 go.sum 则是 composer.lock。
2021-02-02 11:17:27
172
原创 golang 导入包的下划线和点的区别
在golang进行导入包时,我们有时会遇到包的前面需要加下划线或者点,一直不明白是什么意思,随即进行了搜索:包前是下划线_:当导入一个包时,该包下的文件里所有init函数都会被执行,但是有时我们仅仅需要使用init函数而已并不希望把整个包导入(不使用包里的其他函数)包前是点.:import(.“fmt”)这个点操作的含义就是这个包导入之后在你调用这个包的函数时,你可以省略前缀的包名,也就是前面你调用的fmt.Println(“hello world”)可以省略的写成Println(“hello wo
2021-02-01 22:11:21
443
原创 Go和PHP之间的主要区别
Go基本上是一种可用于快速机器代码编译的编程语言,而PHP基本上是服务器端脚本,也是一种用于Web开发的通用编程语言。Go是一种静态类型的语言,而PHP是一种动态类型的语言PHP将核心PHP语言用于模板目的,因此浏览器通过发送的HTML代码处理PHP代码,并将输出发送到浏览器,而对于GO,通常使用简单的模板系统。Go语言得到了社区的广泛支持,并且由于它也得到了Google的支持,因此其社区支持比PHP有所增加。PHP是动态类型的,而Go为采用类似于动态语言的模式的环境提供了支持。Go具有在PHP.
2021-01-31 20:37:36
2746
原创 Rpc和Http的区别
一.远程调用方式无论是微服务还是分布式服务(都是SOA,都是面向服务编程),都面临着服务间的远程调用。那么服务间的远程调用方式有哪些呢?常见的远程调用方式有以下几种:RPC:Remote Produce Call远程过程调用,类似的还有RMI(Remote Methods Invoke 远程方法调用,是JAVA中的概念,是JAVA十三大技术之一)。自定义数据格式,基于原生TCP通信,速度快,效率高。早期的webservice,现在热门的dubbo,都是RPC的典型RPC的框架:webservie(c
2021-01-30 21:39:03
936
原创 怎么用go代码使用protoc编译器编译proto文件生成的pb.go文件
package mainimport ( "fmt" "ProtocDemo/example" "github.com/golang/protobuf/proto" "os")func main() { fmt.Println("Hello World. \n") msg_test := &example.Person{ Name: proto.String("Davie"), Age: proto.Int(18), From: proto.String("Chi
2021-01-29 21:48:29
697
原创 热加载调试 Hot Reload
Python 的 Flask框架,有 debug 模式,启动时传入 debug=True 就可以热加载(Hot Reload, Live Reload)了。即更改源码,保存后,自动触发更新,浏览器上刷新即可。免去了杀进程、重新启动之苦。Gin 原生不支持,但有很多额外的库可以支持。例如github.com/codegangsta/gingithub.com/pilu/fresh这次,我们采用 github.com/pilu/fresh 。go get -v -u github.com/pilu/
2021-01-28 22:08:49
814
原创 Golang timer定时器
timer 计时器用于在指定的Duration类型时间后调用函数或计算表达式。如果只是想指定时间之后执行,使用time.Sleep()使用NewTimer(),可以返回的Timer类型在计时器到期之前,取消该计时器直到使用<-timer.C发送一个值,该计时器才会过期定义计数器timer := time.NewTimer(time.Second * 2)停止定时器timer.Stop()强制的修改timer中规定的时间timer.Reset(0) ticker 周期性的ti
2021-01-27 22:03:04
647
原创 slice的用法以及和数组的区别
slice是go的一个语言特性,其实有点类似于cpp的vector,可变长度,可以扩展空间。今天详细看了下,做下总结。slice本质上是一个区间,原型是[]T,大致的实现是这样的:type slice struct { first *T len int cap int}可以看到的是是一个指向数组的指针,那么在修改slice的时候会改变数组的值。和数组的用法差别不是太大。基于数组的创建:var myArrary [3]int = [3]int{1,2,3}var
2021-01-26 21:19:03
1212
原创 goroutine
原始版本:func add(a int) int { //假设处理业务逻辑需要100ms time.Sleep(time.Millisecond * 100) return a}func main() { sum := 0 start := time.Now().UnixNano() / 1e6 for i := 0; i < 100; i++ { sum += add(i) } end := time.Now().UnixNano() / 1e6 fmt.Printf("
2021-01-25 22:29:44
101
原创 go递归循环遍历文件夹
/**dirname 目录名称level 层级关系 */func listFiles(dirName string,level int) { //level用来记录当前递归的层次,生成带有层次感的空格 s :="|--" for i:=0;i<level;i++ { s = "| "+s } fileInfos,err := ioutil.ReadDir(dirName) if err != nil { log.Fatal(err) } for _,fi := ran
2021-01-24 12:09:12
487
原创 go复制文件的三种方式
方法一:io包下的Read()和Write()方法实现我们可以通过io包下的Read()和Write()方法,边读边写,就能够实现文件的复制。这个方法是按块读取文件,块的大小也会影响到程序的性能该函数的功能:实现文件的拷贝,返回值是拷贝的总数量(字节),错误func copyFile1(srcFile,destFile string)(int,error){ file1,err:=os.Open(srcFile) if err != nil{ return 0,err } file2,er
2021-01-23 19:04:34
760
原创 time包的使用
package mainimport ( "fmt" "math/rand" "time")func main() { //1.获取当前时间 t1 := time.Now()//time.Time//结构体类型 fmt.Printf("%T\n",t1)// fmt.Println(t1) //2.获取指定时间 //调用的只是time包下的函数Date(),返回一个结构体对象 t2 := time.Date(2009,7,15,16,30,28,0,time.Local)//
2021-01-22 15:56:24
189
原创 go Panic & Recover
PanicGo 的类型系统会在编译时捕获很多错误,但有些错误只能在运行时检查,如数组访问越界、空指针引用等。这些运行时错误会引起painc异常。一般而言,当panic异常发生时,程序会中断运行,并立即执行在该goroutine中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。通常,我们不需要再次运行程序去定位问题,日志信息已经提供了足够的诊断依据。因此,在我们填写问题报告时,一般会将panic异常和日志信息一并记录。由于pan
2021-01-21 18:23:17
238
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅