少林码僧
专注elasticsearch搜索领域8年,有海量数据搜索功能架构经验
展开
-
Go 官方发布了 Go 1.20.3 和 Go 1.19.8
mime/multipart.Reader.ReadForm 限制了解析的多部分表单可以消耗的总内存。这会影响使用 mime/multipart.Reader.ReadForm 的程序,以及在 net/http 包中使用请求方法 FormFile、FormValue、ParseMultipartForm 和 PostFormValue 进行的表单解析。输入数据的某些异常模式可能会导致用于解析 HTTP 和 MIME 标头的通用函数分配比保存已解析标头所需的内存更多的内存。原创 2023-12-21 17:57:33 · 8799 阅读 · 0 评论 -
Go集成elasticsearch8极简demo,光速入门
编辑器添加goproxy。原创 2023-12-18 14:46:36 · 470 阅读 · 0 评论 -
mysql binlog_ignore_db参数的效果详解
我们知道 binlog 会记录数据库所有执行的 DDL 和 DML 语句(除了数据查询语句select、show等)。我们可以在mysql配置文件中关闭binlog注意默认情况下会记录所有库的操作,那么如果我们有另类需求,比如说只让某个库记录 binglog 或排除某个库记录 binlog ,需要怎么配置呢?原创 2023-12-15 06:39:39 · 554 阅读 · 0 评论 -
kafka的lag(kafka的消费堆积)为什么有时是负数?
Kafka Manager先从zookeeper获取LogSize,再从kafka __consumer_offsets topic读取Offset。由于这两步操作存在时间间隔,因此吞吐很大的topic或者当前集群负载很高的时候就会出现Offset > LogSize的情况。原创 2023-12-14 15:22:19 · 763 阅读 · 0 评论 -
深入理解 Goroutines 和 Go Scheduler
本文将重点帮助您了解 Golang 中的 goroutines。Go 调度程序如何工作以在 Go 中实现最佳并发性能。我会尽力用简单的语言解释,这样你就可以理解了。我们将介绍什么是操作系统中的线程和进程,什么是并发,为什么实现并发很难,以及 goroutines 如何帮助我们实现并发。然后,我们将深入研究 Golang 的内部架构,即 Go Scheduler,它管理多个 goroutine 的调度,以便每个 goroutine 获得公平的机会,并且本质上不会阻塞。原创 2023-12-13 11:10:53 · 999 阅读 · 2 评论 -
golang实现同步阻塞、同步非阻塞、异步非阻塞IO模型
然后,我们使用"net.Conn.Read"函数从客户端读取数据,并使用"processData"函数来处理客户端发送的数据。然后,我们使用"listener.Accept"函数接受客户端连接,并使用"handleConnection"函数来处理客户端连接。在"handleConnection"函数中,我们使用"net.Conn.Read"函数从客户端读取数据,并使用"processData"函数来处理客户端发送的数据。由于我们使用了同步阻塞IO函数来进行IO操作,所以程序会在执行IO操作时被阻塞。原创 2023-12-13 10:57:39 · 992 阅读 · 0 评论 -
Golang 领域驱动设计(DDD)最佳实践
一个实体是一个唯一的东西,并且可以在相当长的一段时间内持续地变化。唯一的身份标识和可变性(mutability)特征将实体对象和值对象(ValueObject)区分开来。——《实现领域驱动设计》存储层(Repository)接口定义import ("context"原创 2023-12-13 10:31:40 · 1000 阅读 · 0 评论 -
深入理解Golang中的goroutine 池
工作线程池是一种并发模式,由一组负责并发执行任务的工作线程 goroutine 组成。这些员工从共享队列中获取任务,处理任务并返回结果。在处理大量可以并行执行的任务时,工作线程池特别有用,因为它们有助于控制并发运行的 goroutine 数量,并避免因过度创建 goroutine 而产生的开销。考虑一家繁忙的餐厅,厨房是工人的游泳池,厨师是工人的例行公事。餐厅的顾客代表必须完成的任务。顾客的订单必须由厨师在下单时处理。原创 2023-12-13 10:05:47 · 1019 阅读 · 0 评论 -
Goroutine协程调度时机总结
以下四种情形下,goroutine 可能会发生调度,但也并不一定会发生,只是说 Go scheduler 有机会进行调度。原创 2023-07-21 20:32:29 · 120 阅读 · 0 评论 -
Golang假共享(false sharing)详解
假共享是 SMP 系统上的一种常见性能问题。在SMP系统中,每个处理器均有一个高速缓存。当不同处理器上的线程修改驻留在同一高速缓存行(Cache Block,或Cache Line)中的变量时就会发生假共享。这种现象之所以被称为假共享,是因为每个线程并非真正共享相同变量的访问权。访问同一变量或真正共享要求编程式同步结构,以确保有序的数据访问。线程 0 和线程 1 会用到不同变量,它们在内存中彼此相邻,并驻留在同一高速缓存块(Cache Block,或Cache Line)。原创 2023-07-17 22:00:38 · 810 阅读 · 2 评论 -
通过GOROOT实现多个go版本的切换
打开goland在编辑器右上角对点击设置图标,在展开的设置列表中点击Go Settings...\。找到GOROOT点击右边的+号,选择从官网下载的Golang压缩包解压后的目录。原创 2023-02-13 18:53:15 · 873 阅读 · 0 评论 -
Go channel实现原理及源码解读
我们开发中,chan 的值或者状态会有很多种情况,此时一定要注意使用方式,一些操作可能会出现 panic。原创 2023-02-10 22:39:49 · 477 阅读 · 0 评论 -
推荐一个实用的ssh终端工具
推荐一个实用的golang小工具原创 2022-08-21 22:25:51 · 8177 阅读 · 0 评论 -
Go 1.19新特性
美国时间2022年5月7日,Go 1.19版本开发分支进入新特性冻结(freeze)阶段,即只能修Bug,不能再向Go 1.19版本中增加新特性了。由于上一个版本Go 1.18因引入泛型改动较大,推迟了一个月发布,这直接导致了Go 1.19版本的开发周期被缩短。虽然开发周期少了近一个月,但Go 1.19版本仍然会按计划在2022年8月份发布。而Go 1.19的第一个beta版也于今天凌晨发布了。Go 1.19版本都有哪些重要变化呢,我通过这篇文章带大家先睹为快。尽管Go核心团队在Go 1.18泛型上投入了很原创 2022-07-07 11:40:51 · 147187 阅读 · 0 评论 -
Hash表的时间复杂度为什么是O(1)?
@TOC要了解 Hash 表,需要先从数组说起数组数组会在内存中申请连续的地址空间,且数组中各元素类型必须一致上图假设数组元素为整型,由于整形占据4各字节的内存空间,所以上图每个数组的内存地址从下标0开始,下标每增加1,地址就增加4所以只要知道了数组的下标,就可以计算得到数组的地址,比如元素4,我们知道数组起始地址后,只要用起始地址+下标*4就可以知道元素4的地址,所以访问数组元素的时间复杂度为O(1)......原创 2021-12-04 19:50:36 · 302776 阅读 · 2 评论 -
windows通过docker-machine使用virtualbox创建docker环境
安装git-bash-for-windows打开git-bash原创 2022-07-02 18:05:31 · 574 阅读 · 0 评论 -
Go语言优化技巧总结篇
一、常规手段(一)sync.Pool临时对象池应该是对可读性影响最小且优化效果显著的手段。基本上,业内以高性能著称的开源库,都会使用到。最典型的就是fasthttp(网址:https://github.com/valyala/fasthttp/)了,它几乎把所有的对象都用sync.Pool维护。但这样的复用不一定全是合理的。比如在fasthttp中,传递上下文相关信息的RequestCtx就是用sync.Pool维护的,这就导致了你不能把它传递给其他的goroutine。如果要在fasthttp中原创 2022-05-28 22:12:45 · 809 阅读 · 0 评论 -
自动发现 Go 项目 Bug 的神器
Go1.18 新特性中有一个神器:Fuzzing,对于发现 Go 项目中的 Bug 很有帮助。本文通过一个具体的例子来介绍它的基本使用,希望你能掌握并应用。以下这个函数,你能找到几个 bug?它的功能看起来很简单——对于一个字符串,用一个新的用户定义字符覆盖它的第一个字符 n 次。例如,如果我们运行OverwriteString(“Hello, World!”, “A”, 5),正确的输出是:“AAAAA, World!”。// overwrite_string.go// OverwriteStrin原创 2022-05-28 22:06:32 · 263 阅读 · 0 评论 -
Go 面向包的设计和架构分层
Go 面向包的设计和架构分层序本篇内容主要讲解golang项目的面向包设计准则和基础的架构分层。信息来自原文Ardan Labs: Package-Oriented-Design,Github: golang standard project layout,Microsoft: Design Fundamentals - Layout Application Guideline内容进行翻译、加工、整合及结合个人的实践经验,并附有一个真实的例子来解释本篇内容。group event当原创 2022-02-27 00:16:04 · 618 阅读 · 0 评论 -
编写和优化Go代码
本文档概述了编写高性能Go代码的最佳实践。虽然有些讨论会提高单个服务的速度(通过缓存等),但设计高性能的分布式系统已经超出了这项工作的范围。在监控和分布式系统设计方面已经有很好的文章,它包含了一套完全不同的研究和设计权衡理论。所有内容将根据CC-BY-SA进行许可。本书分为以下几节:1) 编写高性能软件的基本技巧 * CS 101-level的东西2) 编写快速软件的技巧 * 关于如何从Go获得最佳效果的Go-specific章节3) 编写*真正*快速软件的高级技巧 * 当原创 2022-01-09 14:24:05 · 493 阅读 · 0 评论 -
Golang性能优化
优化工作流建立评估指标(eg. Latency) → 定位瓶颈(一般都会定位到某个局部) → 寻找局部解决问题方案 → 尝试方案不断重复问题定位工具pprof基本原理:The builtin Go CPU profiler uses the setitimer(2) system call to ask the operating system to be sent a SIGPROF signal 100 times a second. Each signal stops the原创 2022-01-09 14:21:50 · 1193 阅读 · 0 评论 -
Go面向对象
原创 2022-01-06 23:25:09 · 98 阅读 · 0 评论 -
玩转Golang指针
学过C语言的老司机都知道,指针就是一个变量,用于存储另一个变量的内存地址。那么什么是变量呢?在现代计算机体系结构中所有的需要执行的信息代码都需要存储在内存中,为了管理存储在内存的数据,内存是划分为不同的区域的,不同区域都用内存地址来标识。一个典型的内存地址是个16进制的8位数(一个字节)比如0xAFFFF(这是一个内存地址的十六进制表示)。要访问数据,我们需要知道它的存储地址。我们可以跟踪...原创 2019-10-12 15:25:55 · 633 阅读 · 0 评论 -
go interface{}==nil 几种坑及原理
本文是Go比较有名的一个坑,在以前面试的时候也被问过,为什么想起来写这个?因为我们线上就真实出现过这个坑,写给不了解的人在使用 if err != nil 的时候提高警惕。Go语言的interface{}在使用过程中有一个特别坑的特性,当你比较一个interface{}类型的值是否是nil的时候,这是需要特别注意避免的问题。先来看看一个demo:package mainimport "...原创 2019-10-16 15:37:39 · 4596 阅读 · 2 评论 -
go mod 使用指南
环境准备版本要求 golang version >=1.11打开go mod;export GO111MODULE=on设置代理export GOPROXY=https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct设私仓库,不走代理,不计go.sum检验(没有私有仓库跳过此步骤) export GOPRIVATE=www.mukebb.cn/*go get支持 git clone 时用 git@xxx(即ssh)原创 2020-07-15 12:22:14 · 245534 阅读 · 1 评论 -
关于Golang中range指针数据的坑详解
在Golang中使用 for range 语句进行迭代非常的便捷,但在涉及到指针时就得小心一点了。下面的代码中定义了一个元素类型为 *int 的通道 ch :package main import ( "fmt") func main() { ch := make(chan *int, 5) //sender input := []int{1,2,3,4,5} ...原创 2019-10-12 15:03:47 · 1105 阅读 · 0 评论 -
golang中make和new的区别
引出问题先看下面的代码package mainimport ( "fmt")func main() { var i *int *i=10 fmt.Println(*i)}上面的代码会报错,因为对于引用类型的变量,我们不光要声明它,还要为它分配内容空间func main() { var i *int i=new(int) *i=10 fmt.Println(...原创 2019-01-17 11:11:32 · 2701 阅读 · 0 评论 -
golang开发技巧
使用gofmt重要的话说3遍使用gofmt使用gofmt使用gofmtgofmt是golang提供的代码格式化工具,整个团队使用,就不需要做代码风格审查了协程使用规范将并发留给调用者// ListDirectory returns the contents of dir.func ListDirectory(dir string) ([]string, error)// Li...原创 2019-01-17 15:11:50 · 3068 阅读 · 0 评论 -
VSCode配置golang开发环境
VSCode 插件推荐插件安装方法按下 Ctrl/Cmd+P 输入 ext install [插件关键字 / 名称],就可以安装了。下面提供各个插件对应的安装命令。各语言插件Go: ext install ms-vscode.GoGolang 开发必备插件Docker: ext install PeterJausovec.vscode-dockerDocker 语法高亮...原创 2019-01-17 17:51:40 · 9009 阅读 · 0 评论 -
golang详细知识体系
Go编程入门基础语法环境安装下载地址 https://golang.google.cn/dl/GOPATH、GOROOT两个关键环境变量基础结构包的概念程序执行过程—>import package–>init–>main数据类型和变量常量const变量var、:=基础类型bool整型string字符串错误类型 error...原创 2019-02-19 21:02:14 · 980 阅读 · 0 评论 -
Go语言(golang)的错误(error)处理的方案
对于Go语言(golang)的错误设计,相信很多人已经体验过了,它是通过返回值的方式,来强迫调用者对错误进行处理,要么你忽略,要么你处理(处理也可以是继续返回给调用者),对于golang这种设计方式,我们会在代码中写大量的if判断,以便做出决定。func main() { conent,err:=ioutil.ReadFile("filepath") if err !=nil{ //错误...原创 2019-01-17 10:17:23 · 16351 阅读 · 0 评论