golang
文章平均质量分 92
GO语言开发
Generalzy
这个人很懒,什么都没写!
展开
-
GitHub项目监控——gitpython&go-git5操作git
对于常用Github的用户来说,经常有一些自动化的需求。比如监控某些项目的更新情况并实时拉取,比如监控github全网上传的代码是否携带了公司的APIKEY,SECRETKEY等…原创 2023-11-01 22:11:41 · 645 阅读 · 2 评论 -
部署Go Web应用的N+1种方法
可以为多个服务创建不同的配置文件(建议为每个服务(域名)创建一个单独的配置文件),每一个独立的 Nginx 服务配置文件都必须以 .conf结尾,并存储在。标志位-p用来定义端口绑定。Supervisor 是业界流行的一个通用的进程管理程序,它能将一个普通的命令行进程变为后台守护进程,并监控该进程的运行状态,当该进程异常退出时能将其自动重启。内部服务端口为3306,映射到外部的13306端口。上面的部署方案中,所有浏览器的请求都是直接访问前端服务,而如果是浏览器直接访问后端API服务的部署模式下,如下图。原创 2022-05-22 13:25:10 · 2594 阅读 · 0 评论 -
http框架(django,flask,gin)流式导出文件操作
当你在 HTTP 响应中以流的方式写入内容时,如果你设置了 Transfer-Encoding: chunked,那么即使你写入了 1GB 的数据,HTTP 响应也只会有一个,但是它的 body 会被分割成多个块逐个发送。请注意,如果你手动设置了 Content-Length 头,但实际发送的数据大小与这个头部声明的大小不一致,那么可能会导致客户端出现错误,因为客户端会期待接收到声明的字节数。在实践中,如果你知道响应体的大小,并且希望客户端能够显示下载进度,你应该设置 Content-Length 头。原创 2022-07-14 23:13:39 · 1412 阅读 · 0 评论 -
LRU go cache的实现
一致性哈希算法是Cache 从单节点走向分布式节点的一个重要的环节。对于分布式缓存来说,当一个节点接收到请求,如果该节点并没有存储缓存值,那么它面临的难题是,从谁那获取数据?自己,还是节点1, 2, 3, 4…。假设包括自己在内一共有 10 个节点,当一个节点接收到请求时,随机选择一个节点,由该节点从数据源获取数据。假设第一次随机选取了节点 1 ,节点 1 从数据源获取到数据的同时缓存该数据;原创 2024-09-08 20:05:53 · 1167 阅读 · 0 评论 -
golang 解压带密码的zip包
时候(即二进制:00000000 00000100),表示有数据描述部分,本地文件头中的 CRC-32、压缩大小和未压缩大小字段都被设置为0(虽然zip规范是这么定义,但是发现有些压缩包即使声明有数据描述部分,但是本地文件头的CRC-32、压缩大小和未压缩大小依然还是设置为真实值) , 正确的值被放在紧跟在压缩数据之后的数据描述部分,apk的通用标志位默认传0即可,也有传2048、2056,目前第15位是PKWARE保留位。通过ZIP文件的结构我们发现,ZIP文件的中央目录区保存了所有的文件信息。原创 2024-07-20 15:16:46 · 981 阅读 · 3 评论 -
23种计模式之Python/Go实现
设计模式是面对各种问题进行提炼和抽象而形成的解决方案。这些设计方案是前人不断试验,考虑了封装性、复用性、效率、可修改、可移植等各种因素的高度总结。它不限于一种特定的语言,它是一种解决问题的思想和方法。由于高级语言的出现,让机器读懂你的意图已经不是最主要的“矛盾”,而让人读懂你的意图才是最重要。按照设计模式编写的代码,其可读性也会大大提升,利于团队项目的继承和扩展。设计模式可以分为三个大类:创建类设计模式、结构类设计模式、行为类设计模式下面用一个图片来整体描述一下设计模式之间的关系:单例模式、工厂模式(简单工原创 2024-02-13 20:16:50 · 2307 阅读 · 2 评论 -
验证go循环删除slice,map的操作和map delete操作不会释放底层内存的问题
循环删除切片元素可能会引发意外的结果,因为切片的长度在循环过程中可能会发生变化,导致索引越界或不正确的元素被删除。在这个示例中,我们首先记录了需要删除的元素的索引,然后在第二个循环中进行了删除操作。可以看到,新版本的 Golang 难道真的会回收 map 的多余空间,难道哈希表会随着 map 里面的元素变少,然后缩小了?也就是说,在迭代期间创建的key,有的可能会被输出,也的就可能会被跳过。正确的做法是,可以首先记录需要删除的元素的索引,然后再循环外面执行删除操作,避免在循环中修改切片。原创 2023-08-29 00:11:26 · 2275 阅读 · 1 评论 -
golang操作excel的高性能库——excelize/v2
Excelize是一个纯Go编写的库,提供了一组功能,允许你向XLAM / XLSM / XLSX / XLTM / XLTX文件写入和读取。支持读取和写入由Microsoft Excel™ 2007及更高版本生成的电子表格文档。通过高度兼容性支持复杂组件,并提供了流式API,用于生成或从包含大量数据的工作表中读取数据。此库需要Go版本1.16或更高版本。可以使用Go的内置文档工具查看完整文档,也可以在go.dev和文档引用中在线查阅。原创 2023-08-16 21:04:10 · 11817 阅读 · 2 评论 -
Go语言调用Lua
Lua支持多个参数和多个返回值,参数好办,用lua.LNumber(123),返回值个数也可以是多个,调用CallByParam的时候,NRet就是返回参数个数,Fn是要调用的全局函数名,Protect为true时,如果没找到函数或者出错不会panic,只会返回err。README 提供的实例池实现,但注意到该实现在初始状态时,并未创建足够多的虚拟机实例(初始时,实例数为 0),以及存在 slice 的动态扩容问题,这都是值得改进的地方(这是一个可以提交pr的点)。一旦扩展,它将不会再缩小。原创 2023-07-22 11:48:51 · 1827 阅读 · 2 评论 -
go小技巧(易错点)集锦
const (// Fig: 4iota 在下一行增长,而不是立即取得它的引用。原创 2023-05-11 12:03:57 · 919 阅读 · 0 评论 -
Go goroutine——GMP理论
Go runtime 会负责 goroutine 的生老病死,从创建到销毁,都一手包办。Runtime 会在程序启动的时候,创建 M 个线程(CPU 执行调度的单位),之后创建的 N 个 goroutine 都会依附在这 M 个线程上执行。这就是 M:N 模型:在同一时刻,一个线程上只能跑一个 goroutine。当 goroutine 发生阻塞时,runtime 会把当前 goroutine 调度走,让其他 goroutine 来执行。原创 2023-03-20 18:30:04 · 320 阅读 · 0 评论 -
go执行cmd模块——exec
exec包可以用于执行外部命令。简单来说,就是可以用该包来执行其它的应用程序(比如shell脚本,或者其它任意可执行程序)。它对os.StartProcess函数做了包装,以便更容易的对输入输出做处理,使用管道连接I/O,以及作其它的一些调整。原创 2023-03-17 11:52:27 · 2190 阅读 · 1 评论 -
Go Signal信号
但是需要注意的是,此时程序的PID变化了,因为endless 是通过fork子进程处理新请求,待原进程处理完当前请求后再退出的方式实现优雅重启的。handler是1个[3]uint32数组,uint32的每位都可以可以存储对应的信号,意味着一个channel至多可以存储96个信号,当前所有系统的信号总数为65个,因此handler足以存储所有的信号。一个是 stop方法用来取消监听。当信号发送到某个进程中时,操作系统会中断该进程的正常流程,并进入相应的信号处理函数执行操作,完成后再回到中断的地方继续执行。原创 2023-03-09 20:29:30 · 1357 阅读 · 0 评论 -
Go设计模式之函数选项模式
函数选项模式(Functional Options Pattern)也称为选项模式(Options Pattern),是一种创造性的设计模式,允许使用接受零个或多个函数作为参数的可变构造函数构建复杂结构。在一些场景下,并不想对外暴露具体的配置结构体,而是仅仅对外提供一个功能函数,这时可以将对应的结构体定义为小写字母开头,将其限制只在包内部使用。WithXxx是函数选项模式中约定成俗的函数名称格式,这样构造函数就可以改写成如下方式了,除了必须传递a参数外,其他的参数都是可选的。原创 2023-02-20 10:26:04 · 588 阅读 · 0 评论 -
api接口限流方案——(漏桶与令牌桶)
redis操作时单线程的,平常如果想要redis原子性操作的话,可以使用incrBy()和decrBy()方法进行原子性的加减,但是对于事务性的逻辑操作,没有办法实现原子性,Redis 使用单个 Lua 解释器去运行所有脚本,当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行,因此,lua脚本需要运行的使用比较快,不会妨碍其它lua脚本执行。需要注意的是,匿名用户的限流策略可能会相对容易被绕过,因此在设计限流策略时,需要权衡安全性和用户体验,并考虑到可能的滥用情况。原创 2023-02-16 23:39:33 · 2064 阅读 · 0 评论 -
各类配置文件格式简介(ini,yaml,conf,xml...)和nb的Viper
ini文件是一个无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统。ini文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。XML设计用来传送及携带数据信息,所以也经常用来做配置文件。原创 2023-01-29 19:58:07 · 14858 阅读 · 0 评论 -
Gorm v2全解
GORM 倾向于约定优于配置默认情况下,GORM 使用 ID 作为主键,使用结构体名的 蛇形复数 作为表名,字段名的 蛇形 作为列名,并使用 CreatedAt、UpdatedAt 字段追踪创建、更新时间。如果同意以上约定,配置文件就不需要写一堆了,否则就可以自定义约定。问题原文:答案:import ("fmt""time"gorm.Model// Team不会出现在表中})自定义连接表要求外键是复合主键或复合唯一索引ID int"`ID uint// ...原创 2023-02-08 10:49:18 · 3063 阅读 · 2 评论 -
Go1.18,1.19 泛型从入门到放弃+Go1.21
/ Printf() 可输出变量value的类型(底层就是通过反射实现的)// 通过反射可以动态获得变量value的类型从而分情况处理// ...为了避免使用反射而选择了泛型,结果到头来又为了一些功能在在泛型中使用反射,是不是真的需要用泛型?在Go1.18之前,Go官方对 接口(interface) 的定义是:接口是一个方法集(method set)Go1.18开始就是依据这一点将接口的定义正式更改为了 类型集(Type set)原创 2023-02-06 12:19:14 · 3828 阅读 · 0 评论 -
go runtime
runtime.Gosched()用于将当前的goroutine让出CPU时间片,让其它的goroutine获得执行机会。同时,当前的goroutine会在未来某个时间点继续运行。上面的Callers只是获取栈的程序计数器,如果想获得整个栈的信息,可以使用CallersFrames函数,省去遍历调用FuncForPC。它可以把程序计数器地址对应的函数的信息获取出来。如果因为内联程序计数器对应多个函数,它返回最外面的函数。Func可以获得函数地址、文件行、函数名等信息。Func类型的值,通过。原创 2023-01-31 17:24:15 · 1388 阅读 · 0 评论 -
go test工具包使用Go进行单元测试
Go 语言从开发初期就注意了测试用例的编写。特别是静态语言,由于调试没有动态语言那么方便,所以能最快最方便地编写一个测试用例就显得非常重要了。原创 2023-01-29 17:17:22 · 2195 阅读 · 0 评论 -
跨平台编译go(交叉编译)/go在windows编译添加图标icon
以将一个简单的go http 部署到docker为例!原创 2023-01-29 15:03:36 · 2813 阅读 · 0 评论 -
go与python的深浅copy对比
如果是值类型,就会产生深拷贝如果是引用类型,就会产生浅拷贝深拷贝:光拷贝值,地址不相关。拷贝结束两变量互不影响。浅拷贝:拷贝地址。两变量指向同一地址。拷贝结束也相关,改变一个,另一个也跟着变。原创 2023-01-15 19:25:13 · 739 阅读 · 0 评论 -
go语言编码库encoding
encoding包定义了供其它包使用的可以将数据在字节水平和文本表示之间转换的接口。encoding/gob、encoding/json、encoding/xml三个包都会检查使用这些接口。原创 2022-12-19 14:56:49 · 306 阅读 · 0 评论 -
内存对齐对性能的影响(unsafe.Pointer和uintptr)
在unsafe包中,只提供了3个函数,两个类型。就这么少的量,却有着超级强悍的功能。CPU 只从对齐的地址开始加载数据CPU 读取块的大小是固定的,通常为 B 的 2 的整数幂次CPU 访问内存时,并不是逐个字节访问,而是以字长(word size)为单位访问。比如 32 位的 CPU ,字长为 4 字节,那么 CPU 访问内存的单位也是 4 字节。这么设计的目的,是减少 CPU 访问内存的次数,加大 CPU 访问内存的吞吐量。原创 2022-10-01 18:12:37 · 864 阅读 · 0 评论 -
GC(垃圾回收)解析
GC ,全称 Garbage Collection ,即垃圾回收,是一种自动内存管理的机制。当程序向操作系统申请的内存不再需要时,垃圾回收主动将其回收并供其他代码进行内存申请时候复用,或者将其归还给操作系统,这种针对内存级别资源的自动回收过程,即为垃圾回收。而负责垃圾回收的程序组件,即为垃圾回收器。一方面,程序员受益于 GC,无需操心、也不再需要对内存进行手动的申请和释放操作,GC 在程序运行时自动释放残留的内存。原创 2022-10-01 16:53:45 · 2106 阅读 · 0 评论 -
go语言工具(tool)
它是一个非常有用的工具,可以帮助开发者查看包的用法、函数的参数、类型的定义以及相关的文档注释,从而更好地了解和使用 Go 标准库以及第三方库。是 Go 编程语言中的一个命令,用于更新旧版本的 Go 代码以适应新版本的语言规范和库变化。是 Go 编程语言中的一个命令,用于获取并安装指定的包或模块。它是一个非常有用的工具,可以用于快速获取第三方库或工具,并将其安装到你的 Go 工作区中,以便在项目中引用和使用。它是 Go 语言官方提供的一个工具,用于保持代码风格的一致性,使代码具有统一的格式,便于阅读和维护。原创 2022-08-20 22:25:52 · 5065 阅读 · 0 评论 -
Go语言中的逃逸分析
逃逸分析是指编译器在执行静态代码分析后,对内存管理进行的优化和简化。在编译原理中,分析指针动态范围的方法被称为逃逸分析。通俗来讲,当一个对象的指针被多个方法或线程引用时,则称这个指针发生了逃逸。逃逸分析决定一个变量是分配在堆上还是分配在栈上。原创 2022-08-20 21:44:11 · 1205 阅读 · 0 评论 -
go time,python time,datetime事件模块详解
GMT在历史上曾经是全球通用的标准时间,但后来由于地球自转速率的微小变化以及时间测量技术的进步,国际原子时(International Atomic Time,TAI)和协调世界时(Coordinated Universal Time,UTC)被引入作为更精确的时间标准。UTC是由原子钟提供的高度精确的时间测量,它基于国际原子时(International Atomic Time,TAI),而TAI则是由多个原子钟的平均值计算得出的。中国标准时间是以中国的首都北京为基准的标准时间,其时区代码为UTC+8。原创 2022-06-20 23:56:45 · 474 阅读 · 0 评论 -
go.path/filepath — 兼容操作系统的文件路径操作
path 包提供了对分隔的路径的实用操作函数,filepath包实现了兼容各操作系统的文件路径的实用操作函数。在 Unix 中,路径的分隔符是,但 Windows 是。在使用 path 包时,应该总是使用,不论什么系统。path 包中提供的函数,filepath 都有提供,功能类似,但实现不同。一般应该总是使用 filepath 包,而不是 path 包。原创 2022-06-12 22:33:18 · 884 阅读 · 0 评论 -
go语言标准库之——net库
常用ipv4常用ipv6ip类型ip掩码连接类型监听地址类型ipaddrtcpaddrudpaddrunixaddrHTTP客户端基本的HTTP/HTTPS请求响应程序在使用完response后必须关闭回复的主体。GET请求详例(异常捕获已去除)Post请求详例(异常捕获已去除)自定义Client要管理HTTP客户端的头域、重定向策略和其他设置,创建一个Client:自定义Transport要管理代理、TLS配置、keep-alive、压缩原创 2022-06-12 14:53:29 · 1289 阅读 · 0 评论 -
go语言标准库之——os模块
os包提供了操作系统函数的不依赖平台的接口。原创 2022-06-11 19:21:30 · 972 阅读 · 0 评论 -
命令行参数:go(flag+cobra)&python(argpase模块)
返回的是该类型的指针。flag.Type(flag名, 默认值, 帮助信息)*Typename := flag.String("name", "张三", "姓名")age := flag.Int("age", 18, "年龄")married := flag.Bool("married", false, "婚否")delay := flag.Duration("d", 0, "时间间隔")原创 2022-06-10 21:37:04 · 526 阅读 · 0 评论 -
go语言标准库之——strconv包
fmt设置返回值的格式:‘f’(-ddd.dddd)、‘b’(-ddddp±ddd,指数为二进制)、‘e’(-d.dddde±dd,十进制指数)、‘E’(-d.ddddE±dd,十进制指数)、‘g’(指数很大时用’e’格式,否则’f’格式)、‘G’(指数很大时用’E’格式,否则’f’格式)。对’g’、‘G’,它控制总的数字个数。bitSize预期数值的bit大小,用于数值上限限制,最终返回的还是int64类型,0、8、16、32、64 分别代表 int、int8、int16、int32、int64;原创 2022-06-08 23:57:07 · 412 阅读 · 0 评论 -
go排序sort包详解
sort包提供了排序切片和用户自定义数据集的函数。原创 2022-06-01 22:48:07 · 625 阅读 · 0 评论 -
go module详解——导入本地包(go.mod)
GOROOT和GOPATH都是环境变量,其中GOROOT是安装go开发包的路径,而从Go 1.8版本开始,Go开发包在安装完成后会为GOPATH设置一个默认目录。并且在Go1.14及之后的版本中启用了Go Module模式之后,不一定非要将代码写到GOPATH目录下,所以也就不需要再自己配置GOPATH了,使用默认的即可。想要查看电脑上的GOPATH路径,只需要打开终端输入以下命令并回车:在终端输出的内容中找到GOPATH对应的具体路径。go module是Go1.11版本之后官方推出的版本管理工具,并且原创 2022-05-29 21:23:12 · 1970 阅读 · 0 评论 -
go json技巧以及强大的三方json库(jsoniter)
内置的json包不识别我们常用的字符串时间格式= nil {为某个类型实现了MarshalJSON()([]byte, error)和UnmarshalJSON(b []byte) error方法,那么这个类型在序列化(MarshalJSON)/反序列化(UnmarshalJSON)时就会使用你定制的相应方法。原创 2022-05-28 16:18:06 · 4023 阅读 · 0 评论 -
转go踩坑(代码块label等)
goto语句通过标签进行代码间的无条件跳转。在 C++ 中使用 new 创建的变量总是分配到堆内存上的,但在 Go 中即使使用 new()、make() 来创建变量,变量为内存分配位置依旧归 Go 编译器管。Go 编译器会根据变量的大小及其 “escape analysis” 的结果来决定变量的存储位置,故能准确返回本地变量的地址,这在 C/C++ 中是不行的。break语句还可以在语句后面添加标签,表示退出某个标签对应的代码块,标签要求必须定义在对应的for、switch和 select的代码块上。原创 2022-05-25 23:15:37 · 227 阅读 · 0 评论 -
go日志库log/zap/logrus
logrus 默认的logger在并发写的时候是被mutex保护的,比如当同时调用hook和写log时mutex就会被请求,有另外一种情况,文件是以appending mode打开的, 此时的并发操作就是安全的,可以用logger.SetNoLock()来关闭它。其中,通过r.Use(logger.GinLogger(), logger.GinRecovery(true))注册中间件来使用zap接收gin框架自身的日志,在项目中需要的地方通过使用zap.L().Xxx()方法来记录自定义日志信息。原创 2022-05-22 20:37:13 · 2897 阅读 · 0 评论 -
http压测以及元老压测工具jmeter的使用
在项目正式上线之前,通常需要通过压测来评估当前系统能够支撑的请求量、排查可能存在的隐藏bug。原创 2022-05-22 18:08:04 · 1541 阅读 · 0 评论 -
go语言操作mongo——mongo-driver
这种方法的优点是它可以在你的应用程序启动时就提前创建一个集合,并在需要时重用。此外,如果你的应用程序只需要访问少量的collection,那么这种方法也比较容易实现。此方法返回一个游标。但是,这种方法的缺点是如果你的应用程序需要连接多个数据库或集群,则可能需要在每个数据库或集群中创建不同的集合对象。此外,如果你的应用程序需要访问大量的collection,则预先创建所有集合对象可能会对内存产生负面影响。总之,两种方法都有其优点和缺点,你需要考虑你的应用程序的具体需求和实现,以确定哪种方法最适合你的情况。原创 2022-05-20 23:34:36 · 1168 阅读 · 0 评论