go
文章平均质量分 66
Aiky哇
专注于数据库、go、性能优化,对待当下的态度,决定你未来的高度
展开
-
Go 调试工具:gdb vs dlv
综合比较两个Golang程序调试器gdb和dlv,我认为dlv的功能更为完善,更能满足实际调试时的功能需求。两者的优缺点比较大致如下调试器优势不足dlv对goroutine环境调试支持比较完善暂时没找到gdb符合现有的调试习惯,类似C/C++调试指令都有对goroutine场景支持不足,不能很好的应对goroutine的调试(1)dlv对goroutine的支持更好,我使用gdb的没有找到goroutine的调试方法,可能姿势不对(2)gdb对于局部引用变量无法调试,dlv不会。转载 2023-03-07 20:29:08 · 430 阅读 · 0 评论 -
Go mockito 使用说明 (github/mockey)
mockey是一个简单易用的golang mock库,可以快速方便的mock函数和变量。目前广泛应用于字节跳动服务的单元测试编写。底层是monkey patch,通过在运行时重写函数指令实现。mock后还是进入了原来的函数?私有类型的导出方法(不同包下)goroutine 条件过滤。获取 mock 函数执行次数。报错“功能太短无法打补丁”?增量改变 mock 行为。如何禁用内联和编译优化?mock 后执行原函数。原创 2023-03-01 17:41:34 · 1040 阅读 · 0 评论 -
一次奇怪的 go unknown revision。mod/cache/vcs
然后我去报错的文件夹看了一下,想看看/go/pkg/mod/cache/vcs 这个东西到底是干嘛的。然后开始倒腾,又是升级go版本,又是升级git的,又是配置goproxy。主干分支我编译没有问题,但是切换到新分支后,编译会报错。然后感觉是缓存之类的,于是想着是不是缓存影响的。今天clone了一个go语言项目到本地。于是gitlab打开该仓库链接。然后重新编译就能正常编译了。原创 2023-01-29 21:03:16 · 778 阅读 · 0 评论 -
【学习设计模式11】树形处理——组合模式
上篇:【学习设计模式10】分离抽象与实现——桥接模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式9】兼容扩展坞—适配器模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式8】组装流水线——建造者模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式7】复制粘贴就得了——原型模式_Aiky哇的博客-CSDN博客那么有没有一种方法可以名正言顺的复制粘贴呢?当然有了,那就是原型模式。原型模式也叫克隆模式。https://aikysay.blog.csdn.net/article/deta....原创 2022-06-07 11:20:07 · 196 阅读 · 0 评论 -
【学习设计模式10】分离抽象与实现——桥接模式
上篇:【学习设计模式9】兼容扩展坞—适配器模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式8】组装流水线——建造者模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式7】复制粘贴就得了——原型模式_Aiky哇的博客-CSDN博客那么有没有一种方法可以名正言顺的复制粘贴呢?当然有了,那就是原型模式。原型模式也叫克隆模式。https://aikysay.blog.csdn.net/article/details/123407658建造者模式的定义建造者模式的使用流程建造者模式的适用场景建造者模...原创 2022-05-17 17:19:21 · 302 阅读 · 0 评论 -
【学习设计模式9】兼容扩展坞—适配器模式
上篇:【学习设计模式8】组装流水线——建造者模式_Aiky哇的博客-CSDN博客上篇:【学习设计模式7】复制粘贴就得了——原型模式_Aiky哇的博客-CSDN博客那么有没有一种方法可以名正言顺的复制粘贴呢?当然有了,那就是原型模式。原型模式也叫克隆模式。https://aikysay.blog.csdn.net/article/details/123407658建造者模式的定义建造者模式的使用流程建造者模式的适用场景建造者模式的优缺点参考文献建造者模式(Bulider模式)详解复杂对象的组装与创建...原创 2022-05-10 15:03:12 · 276 阅读 · 0 评论 -
【学习设计模式8】组装流水线——建造者模式
上篇:【学习设计模式7】复制粘贴就得了——原型模式_Aiky哇的博客-CSDN博客那么有没有一种方法可以名正言顺的复制粘贴呢?当然有了,那就是原型模式。原型模式也叫克隆模式。https://aikysay.blog.csdn.net/article/details/123407658建造者模式的定义建造者模式的使用流程建造者模式的适用场景建造者模式的优缺点参考文献建造者模式(Bulider模式)详解复杂对象的组装与创建——建造者模式(三)_Lo...原创 2022-04-18 14:38:10 · 417 阅读 · 0 评论 -
go MethodByName()不能获取私有方法
在使用reflect包获取函数,并调用时,总出现这个报错:panic: reflect: call of reflect.Value.Call on zero Value原创 2022-03-17 17:03:27 · 1663 阅读 · 0 评论 -
Golang的反射reflect深入理解和示例
Golang的反射reflect深入理解和示例【记录于2018年2月】编程语言中反射的概念在计算机科学领域,反射是指一类应用,它们能够自描述和自控制。也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examination),并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。每种语言的反射模型都不同,并且有些语言根本不支持反射。Golang语言实现了反射,反射机制就是在运行时动态的调用对象的方法和属性,官方自带的转载 2022-03-16 14:52:45 · 441 阅读 · 0 评论 -
Go-一个使用%v、%+v、%#v的例子
1、代码package main import "fmt" type Person struct { name string age int sex string} func main() { p := &Person{name: "xxx", age: 18, sex: "男"} fmt.Printf("%v\n", p) fmt.Printf("%+v\n", p) fmt.Printf("%#v\n", p)}2、输出...转载 2022-03-16 11:54:32 · 253 阅读 · 0 评论 -
高性能Go并发建议
1.管道chan吞吐极限10,000,000单次Put,Get耗时大约100ns/op,无论是采用单Go程,还是多Go程并发(并发数:100, 10000, 100000),耗时均没有变化,Go内核这对chan进行优化。解决之道在系统设计时,避免使用管道chan传递主业务数据,避免将业务流程处理流程分割到对个Go程中执行,这样做减少chan传输耗时,和Go程调度耗时,性能会有很大的提升。案例分析nsq和nats都是实时消息队列,nsq在客户端端和服务端大量使用chan转发消息,导致性能不转载 2022-03-03 16:02:42 · 736 阅读 · 0 评论 -
从底层源码看解析go语言的channel实现
什么时候能用呢,大量并发的时候可以么?这个的锁粒度大不大,直接使用锁会更快么?单channel只能是单读单写么,多个读多个写对性能有影响么?并发肯定是会有协程调度的,那channel卡住了,会不会使协程调度更加频繁?channel带不带缓冲区对会go的gc有影响么?...原创 2022-01-25 11:55:14 · 1359 阅读 · 0 评论 -
go的协程调度关系,何时会调度切换造成性能影响?
先说结论,省着浪费大家时间。在如下操作操作不会阻塞go runtime的线程调度:转载 2022-01-18 10:48:15 · 601 阅读 · 0 评论 -
go性能优化小结
内存优化 + 并发优化 + 其他优化转载 2022-01-14 17:44:50 · 554 阅读 · 0 评论 -
go 两个包之间如何相互import?
工作中碰到了个使用场景:我在包A中需要用到在包B中定义的方法。那很简单,我在包A中import "B"。但是我在写包B时发现,我又需要用到在包A中定义的方法。那咋办,下意识在包B中import "A"。然后果不其然报错了,编译过不去,报import cycle not allowed就是循环导入包了,相当于死锁然后搜了一下,有两个比较常见的解决方法:第一种把b包想用的方法从a包中移出去,开个新包或者直接移到b包里。这法子我看用的人还挺多。但这肯定不行啊??我a包包原创 2021-12-10 17:16:50 · 2143 阅读 · 0 评论 -
go的gc机制,内存泄漏和内存逃逸,怎样才能最大减少gc的负担?
gc也就是垃圾回收。最近写的项目,pprof查看性能,发现在gc的消耗非常大,因此想着深入调研一下go的gc模式,了解在写程序时保持哪些好的代码习惯,才能最大的减少程序的gc调用。gc是什么了解的同学可以直接跳过。GC Garbage Collection。直译过来就是垃圾回收。想要进行程序调优,是肯定避不开这个环节的,gc管理不好,很容易造成程序的内存无限增长,然后被系统杀掉,上线的项目发生内存泄漏,肯定是p0级别的问题了。一般写的程序中会用到两种内存,堆内存和栈内存。堆内存就是堆状数据结原创 2021-09-18 18:06:58 · 3210 阅读 · 0 评论 -
go跳出for-switch循环和跳出for-select循环
两个方法,goto和break loopgoto for { switch{ case 条件1: ... break case 条件2: ... goto Loop } } Loop: fmt.Println("test")对于条件1,break只能跳出switch,属于无用代码,使用goto会跳转到指原创 2021-09-18 11:05:20 · 1388 阅读 · 0 评论 -
记一次go中map的坑,并发读写导致的panic
先说结论:go中的map是不支持并发读写的,要支持并发读写需要使用到sync.map,但是这里的并发读写并不只有value值,key值并发读写一样是不行的。都知道map的并发读写是不行的,我在写代码中也时刻保持着这个原则,...原创 2021-08-16 10:19:36 · 2295 阅读 · 0 评论 -
Version of Go is too old for this version of Delve
干活时随便升级了一下vscode,然后go就没法调试了,报错为:Version of Go is too old for this version of Delve (minimum supported version 1.15, suppress this error with --check-go-version=false)是go的delve版本太高了导致没有办法用。在GOPATH下的bin目录,使用./dlv version命令查看dlv的版本。[root@vm10-0-0-5.原创 2021-08-12 15:57:56 · 4598 阅读 · 0 评论 -
go sync.pool优化测试
最近在工作中,频繁用到一些结构体的申请,内存会频繁的进行释放和申请,于是想尝试一下sync.pool的优化效果。sync.pool,需要初始化 Pool,唯一需要的就是设置好 New 函数。当调用 Get 方法时,如果池子里缓存了对象,就直接返回缓存的对象。如果没有存货,则调用 New 函数创建一个新的对象。另外,我们发现 Get 方法取出来的对象和上次 Put 进去的对象实际上是同一个,Pool 没有做任何“清空”的处理。但我们不应当对此有任何假设,因为在实际的并发使用场景中,无法保证这种顺序,最原创 2021-08-10 18:02:22 · 409 阅读 · 0 评论 -
go提取字符串开头字符为float64类型
直接上代码// Get the float64 at the beginning of the stringfunc GetHeadBytesToNum(s string) float64 { reg := regexp.MustCompile(`^[+-]?\d*(\.)?\d*`) numStr := reg.FindString(s) n, _ := strconv.ParseFloat(numStr, 64) return n}其实就是使用正则表达式提取出s开头符合条件的字符.原创 2021-07-30 11:24:09 · 807 阅读 · 0 评论 -
go time.Sleep睡眠指定时间(小时级到纳秒级)
// Sleep pauses the current goroutine for at least the duration d.// A negative or zero duration causes Sleep to return immediately.func Sleep(d Duration)原创 2021-06-16 15:44:11 · 17309 阅读 · 0 评论 -
Go语言中的Read操作的说明
Go语言中Reader接口定义了一个Read操作,实现了Reader接口的都有Read这个函数,接口的定义如下:type Reader interface { Read(p []byte) (n int, err error)}123在实际使用的时候可能会对一个参数和这两个返回值有疑惑,什么时候返回什么值什么的,特别是类似于网络IO这种下面利用官网的文档说明一下。官网文档Reader is the interface that wraps the basic Re...转载 2021-06-10 20:23:36 · 1492 阅读 · 0 评论 -
go两种获取hash值函数md5与crc32性能对比
感觉MD5算法复杂度比crc32高很多,具体高多少呢?测试一下// main.gopackage mainimport ( "crypto/md5" "fmt" "hash/crc32")func main() { data := []byte("test") fmt.Printf("%x", md5.Sum(data))}func Crc32IEEE(data []byte) uint32 { return crc32.Chec转载 2021-05-24 19:43:33 · 1196 阅读 · 0 评论 -
go语言二分查找上下边界
查找左边界保证返回的下脚标id,id左侧的值均比查找值小,右侧的值大于或者等于查找值。比如a[0,1,1,3,4,5,5,5,7]查找1,返回1;查找2,返回3;查找5,返回5;查找-1,返回0;查找8,返回9;查找右边界保证返回的下脚标id,id右侧的值均比查找值大,左侧的值小于或者等于查找值。比如a[0,1,1,3,4,5,5,5,7]查找1,返回2;查找2,返回2;查找5,返回7;查找-1,返回-1;查找8,返回8;代码pa...原创 2021-05-13 14:17:30 · 167 阅读 · 0 评论 -
golang 字符串拼接性能比较
背景最近在做一个服务发现/注册的agent, 各个服务需要通过这个agent来注册自己的服务,在完成开发后,测试性能时发现性能达不到要求,通过pprof 来确认cpu主要耗费在gc上,分析结果主要是由于字符串拼接导致,故需要测试一下字符串拼接的几种方法的性能;字符串拼接的几种方法直接使用加号进行拼接 strings.Join() fmt.Sprintf() bytes.Buffer大量字符串拼接性能测试我们使用的场景主要是大量字符串拼接,所以需要的场景是不断在字符串上拼接所以测试函转载 2021-04-16 10:27:09 · 447 阅读 · 0 评论 -
golang高频面试题:翻转含有中文、数字、英文字母的字符串
问题翻转含有中文、数字、英文字母的字符串"你好abc啊哈哈"代码实现package mainimport"fmt"func main() { src := "你好abc啊哈哈" dst := reverse([]rune(src)) fmt.Printf("%v\n", string(dst))}func reverse(s []rune) []rune { for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { s[转载 2021-04-08 19:44:17 · 290 阅读 · 0 评论 -
sync.WaitGroup和sync.Once
sync.WaitGroup之前在协调多个goroutine的时候,使用了通道。基本都是按下面这样来使用的:package mainimport "fmt"func main() { done := make(chan struct{}) count := 5 for i := 0; i < count; i++ { go func(i int) { defer func() { don转载 2021-04-01 11:12:26 · 240 阅读 · 0 评论 -
go中sync.Once的简单应用场景
基础用法import "sync"...var once sync.Once...once.Do(...something...)...sync.Once只有一个方法Do()作用是,sync.Once类型的变量只会执行一次Do(),无论Do()里面是什么场景因为go是高并发语言,这样sync.Once就有个很好的作用,可以在全局单次的函数中使用。一.延迟初始化这个是网上最常用的,用于执行时的初始化操作,比如在调用函数时先进行一次初始化操作再进行执行。举例:.原创 2021-04-01 11:05:55 · 571 阅读 · 3 评论 -
go中锁的作用范围
网上介绍sync.Mutex的文章已经很多了,这里也不深提。具体就两种,一个互斥锁sync.Mutex;一个读写锁sync.RWMutex。两种锁都有两个方法:Lock()和Unlock()。互斥锁就是,其他线程不能读也不能写;读写锁就是,其他线程可以读但是不能写。但是由于网上的例子大多形式为:var(mtxsync.RWMutexa int)或者为:type A struct{mtxsync.RWMutexa int}导致go语言初学者...原创 2021-03-15 11:05:42 · 1118 阅读 · 0 评论 -
Go标准库 os/signal 使用详解
os/signal包实现了对输入信号的访问。这个包只有两个重要方法,这里向大家介绍一下,希望对你有帮助。1. 信号的转发Notify函数让signal包将输入信号转发到c。如果没有列出要传递的信号,会将所有输入信号传递到c;否则只传递列出的输入信号。signal包不会为了向c发送信息而阻塞(就是说如果发送时c阻塞了,signal包会直接放弃):调用者应该保证c有足够的缓存空间可以跟上期望的信号频率。对使用单一信号用于通知的通道,缓存为1就足够了。可以使用同一通道多次调用Notif...转载 2021-02-07 15:07:41 · 4082 阅读 · 0 评论 -
Go标准库glog使用详解
golang/glog是 C++ 版本google/glog的 Go 版本实现,基本实现了原生 glog 的日志格式。在 Kuberntes 中,glog 是默认日志库。glog 的通用功能glog 将日志级别分为 4 种,分别是:INFO:普通日志; WARNING:告警日志; ERROR:错误日志; FATAL:严重错误日志,打印完日志后程序将会推出(os.Exit())glog 的使用很简单,可参考下面这个例子:package mainimport ( "flag...转载 2021-02-07 11:35:20 · 2323 阅读 · 0 评论 -
Go标准库OS常用函数
1、OS基础操作//获取主机名os.Hostname()//获取当前目录os.Getwd()//获取用户IDos.Getuid()//获取有效用户IDos.Geteuid()//获取组IDos.Getgid()//获取有效组IDos.Getegid()//获取进程IDos.Getpid()//获取父进程IDos.Getppid()//获取环境变量的值os.Getenv("GOPATH")//设置环境变量的值os.Setenv("ORACLE_BASE", "/op转载 2021-02-05 17:47:31 · 631 阅读 · 0 评论 -
看go源码函数调用关系图的开源工具go-callvis使用方式和举例
go-callvis的github地址https://github.com/ofabry/go-callvisgo-callvis的简介go-callvis是为了让go开发人员能用更简单的弄明白go工程中的函数和包之间的调用关系,将工程中的调用关系用图表等可视化的方式展示出来。在大型项目中调用关系非常复杂,用go-callvis工具理解起来会很有帮助。ps:对于代码逻辑很优美的大型工程来说,工具会很有用,看起来结构很清晰;但是对于写的一般的大型工程来说,看起来同样很麻烦,因为生成的图表的调用原创 2021-02-03 12:02:31 · 2598 阅读 · 0 评论 -
go语言切片详解,初始化、扩容、限容、底层
原文链接:https://www.cnblogs.com/sparkdev/p/10704614.html切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合。切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。切片的动态增长是通过内置函数 append() 来实现的,这个函数可以快速且高效地增长切片,也可以通过对切片再次切割,缩小一个切片的大小。因为切片的底层也是在连续的内存块中分配的,所以切片还能获得索引、迭代以及为垃圾回收优化的好处。本文将.转载 2021-01-19 14:32:17 · 4010 阅读 · 1 评论