想搞艺术的程序员
码龄14年
  • 107,655
    被访问
  • 46
    原创
  • 26,443
    排名
  • 7
    粉丝
关注
提问 私信

个人简介:IT 是一门top艺术

  • 加入CSDN时间: 2008-05-03
博客简介:

piaohai的专栏

查看详细资料
  • 2
    领奖
    总分 165 当月 5
个人成就
  • 获得18次点赞
  • 内容获得11次评论
  • 获得40次收藏
创作历程
  • 4篇
    2022年
  • 11篇
    2021年
  • 4篇
    2020年
  • 2篇
    2019年
  • 1篇
    2017年
  • 4篇
    2016年
  • 20篇
    2015年
  • 3篇
    2014年
  • 3篇
    2010年
成就勋章
TA的专栏
  • Go
    19篇
  • 并发
    2篇
  • 线程池
    2篇
  • 源码
    1篇
  • 封装
    2篇
  • 切片
    1篇
  • Nginx
    1篇
  • 高可用
    1篇
  • maven+spring4+struts2+mybatis3
  • JavaScript
    3篇
  • 生活杂谈
    1篇
  • oracle
  • iText
    1篇
  • jersey
    3篇
  • json
    2篇
  • java
    7篇
  • mybaties
  • mybatis
    1篇
  • eclipse
    3篇
  • Troubleshooting
  • 开发艺术
    4篇
  • JUnit
    1篇
  • DataTables
    1篇
兴趣领域 设置
  • 运维
    devops自动化
  • 最近
  • 文章
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

Go限制深度遍历目录下文件

Go限制深度遍历文件夹下的文件
原创
发布博客 2022.04.23 ·
343 阅读 ·
0 点赞 ·
0 评论

Go chan实现并发请求聚合功能

背景有上万台边缘机器,每台都会有多个agent客户端,并且每个agent都会同时向中心系统上报数据,由于上报数据频繁,并发量也大,每个agent都频繁和中心建立连接,导致中心压力非常大,所以需要对此进行优化,对每台机器上的agent上报数据做聚合,批量进行上报,减少边缘和中心的上报频率,从而减轻中心压力。方案边缘增加一个batch中间件,所有agent上报的数据由原来直接向中心上报变为向batch中间件上报batch中间件会聚合请求,再分批向中心上报上报的方式也由原来的同步也改为异步,agent
原创
发布博客 2022.03.06 ·
55 阅读 ·
0 点赞 ·
0 评论

Go 并发控制、防击穿 - singleflight

背景在高并发场景下经常会有存在并发访问同一个资源,这些并发的请求参数是一样,并且响应的结果也是一样,如果每个请求都重复去查询资源,无疑会给系统带来不必要的开销,并且系统压力也会增大。为了保护资源,可以对相同资源的并发请求进行拦截,只允许一个请求去查询资源,然后将获取的资源分享给其他的请求,从而较少重复查询的开销,特别是解决缓存击穿时的并发问题。方案Go singleflightGo提供了singleflight组件:"golang.org/x/sync/singleflight"组件,可以很方
原创
发布博客 2022.02.24 ·
249 阅读 ·
0 点赞 ·
0 评论

Go 并发请求量限制组件分享

背景关于限流Go官方通过一个采用令牌池的算法的实现:golang.org/x/time/rate,但是,这个限制的是每秒的请求数,有的时候我们希望限制的是系统并发处理的请求数量,类似线程池的功能,需求如下:设置一个最大的请求处理数量,当请求超过时,后续请求将等待,直到有请求处理完后被唤醒。请求的等待时间能够指定,超出等待时间就返回,提示给客户端。等待请求的个数需要能够限制,数量超过时就直接返回,提示给客户端。设计设计思路是实现一个Ticket池(NumLimiter),每个请求首先需要向Nu
原创
发布博客 2022.01.11 ·
264 阅读 ·
1 点赞 ·
0 评论

Go database/sql连接池 - 源码学习

引言Go内置了数据库相关的库 - database/sql,实现数据库操作相关的接口,其中还包含一个很重要的功能 - 连接池,用来实现连接的复用,限制连接的数量,从而最大程度的复用连接,提高性能,避免连接数量失控,导致资源消耗不可控。本文借Go内置的database/sql库,来一起学习如何一步步设计包含连接池的数据库组件,包括模型抽象、连接复用,以及如何管理连接数。设计模型抽象首先,我们要对解决领域进行抽象。我们目标是设计一个数据库连接组件,所以第一个对象模型很明确 - 数据库对象, 我们将数
原创
发布博客 2021.12.27 ·
496 阅读 ·
0 点赞 ·
0 评论

Go httptest WriteHeader无效问题

背景测试一个调用http接口时,使用了httptest.NewServer来mock一个http服务端,在验证响应异常状态码时发现奇怪问题,明明设置了异常状态码,但是http.Get始终返回的状态码都是正常的200:mockHttpSrv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello world")) w.WriteHeader(h
原创
发布博客 2021.11.24 ·
211 阅读 ·
1 点赞 ·
0 评论

Go时区Parse的坑

日期解析背景当有一个日期字符串(2014-11-12 11:45:26)需要转化为Go的time类型,我们第一时间肯定会想到time包的Parse方法,指定字符串的格式layout:layout := "2006-01-02 15:04:05"str := "2014-11-12 11:45:26"t, err := time.Parse(layout, str)但是,有个容易忽略的问题,go语言默认的时区用的是UTC,而我们一般要的是本地时区,可以看一下源码:package timefu
原创
发布博客 2021.11.23 ·
196 阅读 ·
0 点赞 ·
0 评论

Go http handler统一响应&异常处理

背景在web开发中,一般会写如下方法, 处理http的请求和响应结果:// 处理hello请求的handlerfunc HelloHandler(w http.ResponseWriter, req *http.Request) { name := req.URL.Query().Get("name") if name == "" { // name 必填判断 w.Write([]byte("name is required")) w.WriteHeader(http.StatusBadR
原创
发布博客 2021.11.22 ·
1373 阅读 ·
1 点赞 ·
0 评论

Go推荐命名规范

Go命名规范好的命名可以提高代码的可读性,特点:统一 : 容易猜想,约定俗成简短 :容易书写(Go尤为强调)准确 :准确表达意思核心准则声明的地方和使用的地方离得越远,名字就建议越详细,相对也会越长,同样上下文没提供有效的描述也是如此。Camel命名Go推荐驼峰命名方式,不建议使用下划线(包括常量,包名)GooduserMangerUserManagerBeduser_manager单词缩写默认全大写,或全小写GooduserIDbaiduCDNidcd
原创
发布博客 2021.11.17 ·
292 阅读 ·
0 点赞 ·
0 评论

Go接口 - interface 实践

interface是GO语言中非常重要的类型,它是用来定义一类方法集,只表示对象的行为(Behavior),GO语言的接口和实现不需要显示关联(也就是常说的duck类型),只要实现了接口所有方法,就可以当做该接口的一个实现,赋值给所有引用该接口的变量,从而满足面向对象编程(OOP)中的两个非常重要原则:依赖倒置、里氏替换。也正由于这个特点,所以GO接口最佳的实践是:接口尽量的小,根据实际的需求定义的接口大小。例如:io包体的Reader/Writertype Reader interface {
原创
发布博客 2021.11.15 ·
153 阅读 ·
0 点赞 ·
0 评论

Go 1.17泛型尝鲜

简介Go不支持泛型,但是对泛型呼声一直存在,所以Go也一直在努力支持,这次发布的1.17实际上就已经包含了泛型的功能,但是默认是不开启,需要增加:-G=3参数来开启:go run -gcflags=-G=3 main.goGo的泛型有以下应用场景例子泛化形参数组定义一个函数helloSlice,接收切片参数s,元素类型为任意类型T代码:package main import "fmt" // T 自定义类型func helloSlice[T any] (s []T) { for
原创
发布博客 2021.11.02 ·
156 阅读 ·
0 点赞 ·
0 评论

Go数组&切片使用

声明数组:var array [size] string切片:var slice [] string差异:数组的声明需要指定“size”,如果不指定就是为切片(slice)初始化数组:var array1 = [3] string{"one", "two", "three"}var array2 = [...] string{"one", "two", "three"}array3 := [...] string{"one", "two", "three"} // 推荐:无需通过va
原创
发布博客 2021.11.01 ·
13 阅读 ·
0 点赞 ·
0 评论

exec.Command僵尸进程问题

问题exec.Command是Go标准库提供了一个可以很容易地运行外部命令的方法,但是如果使用不当会容易出现僵尸进程的问题。僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。exec.Command执行的方法有两种,一种是直接调用Run()方法:cmd := exec.Command("ls")cmd.Run()另外一种是用start方法c
原创
发布博客 2021.10.31 ·
244 阅读 ·
0 点赞 ·
0 评论

Go 日志组件封装

背景Go目前流行多个日志组件:logrus、zap、zerolog、seelog,他们有各自的优点,但是使用方式存在差异, 如何屏蔽这些差异,对外提供统一的接口,减少对具体的日志组件依赖,从而方便后续组件替换?对此,我们可以增加一层防腐层,定义一套统一的日志接口,业务代码不直接依赖具体的日志实现,而是依赖抽象接口,这样就可以将具体的实现进行隔离,业务代码就不会包含具体日志组件相关的代码,当日志组件需要替换时,只要做一层适配,实现约定好的日志接口方法,就可以无缝进行切换日志组件。方案定义日志接
原创
发布博客 2021.10.28 ·
135 阅读 ·
0 点赞 ·
0 评论

Go最佳实践总结

title: Go最佳实践总结date: 2021-03-21 17:10:09tags: - Gocategories: - 实践总结State & Behavior面向对象编程(OOP)中,将对象抽象为两个重要的属性: 状态(State) 行为( Behaivor) GO语言是通过type来实现: 状态 (State)- 数据结构(Data structure) 行为(Behavior)- 方法(Method) interface.
原创
发布博客 2021.03.21 ·
194 阅读 ·
0 点赞 ·
0 评论

Go正则判断包含某个单词忽略大小写

GO语言如何判断字符串中是否包含有某个单词,同时忽略大小写?!通过分析可以知道,不能简单的通过是否包含字符串来判断,例如: 字符串“kiss goodbye”,虽然是有包含good,但是并不是我们要的匹配,单词的前和后是有空格或是换行隔开,或是没有任何东西,对应的正则表达式如下:`(^|([\s\t
]+))(good)($|([\s\t
]+))`(^|([\s\t
]+)): good开头或是前面是空白、换行、tab分隔($|([\s\t
]+)):good结尾或是后面是空白、
原创
发布博客 2020.10.17 ·
1726 阅读 ·
0 点赞 ·
0 评论

N个有序的集合合并成一个有序集合

如何将N个有序的集合合并成一个有序集合?!我们可以将集合进行两两合并,然后将结果再次两两合并,不断重复,最终合并成一个集合,实际上就只是个递归算法,代码如下:package mainimport "fmt"func main() { mock1:= []int {2,5,9} mock2:= []int {1,3,4} mock3:= []int {6,7,8} fmt.Println(mergeN(mock1, mock2, mock3)) // 输出:[1 2 3 4 5 6
原创
发布博客 2020.09.26 ·
277 阅读 ·
0 点赞 ·
0 评论

笔记本(Electron + Vue + Element UI)

市面上笔记本软件广告太多,功能不好用,就自己动手做了一个【虾记】(瞎记,开源地址:https://github.com/itart-top/notebook),使用(Electron + Vue + Element UI),支持:1. 笔记分类2. 打重要标识3. 收藏网址、文件夹、软件,支持点击直接打开:4. 快速搜索5. 右下角最小化软件...
原创
发布博客 2020.07.19 ·
311 阅读 ·
0 点赞 ·
0 评论

GO 协程池 - Goroutine复用、限制数量

创建一个协成复用,限制协成数量的协成池package poolimport ( "fmt")type Pool interface { Schedule(task func()) error}type pool struct { work chan func() sem chan struct{} // 计数,限制协成数}func New(size int) ...
原创
发布博客 2020.05.03 ·
946 阅读 ·
0 点赞 ·
0 评论

Nginx 502问题排查 - proxy_next_upstream

最近线上用户请求时不时返回502,并且没多大规律,我们的部署架构是Nginx + web应用,nginx中的upstream配置了两个web做负载均衡。经过分析web应用,出现502的时候请求并没有到达web应用,所以可以断定请求502是Nginx直接返回,查看Nginx的access.log可以查到对应的请求信息,确实返回502GET /api/app/1 HTTP/1.1" 502 ...
原创
发布博客 2019.10.26 ·
4061 阅读 ·
2 点赞 ·
0 评论
加载更多