![](https://img-blog.csdnimg.cn/9706e6fabde142adb145ef3dea2dc07e.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Golang
文章平均质量分 74
Golang 编程语言
Ch3nnn
这个作者很懒,什么都没留下…
展开
-
Go 编程风格指南 - 最佳实践
使用日志分级(log.V)对你有利。分级的日志对开发和追踪很有用。建立一个关于粗略程度的约定是有帮助的。比如说。在V(1)写少量的额外信息在V(2)中跟踪更多信息在V(3)中倾倒大量的内部状态。为了尽量减少粗略记录的成本,你应该确保即使在log.V关闭的情况下也不要意外地调用昂贵的函数。log.V提供两个API。更方便的那个带有这种意外支出的风险。如有疑问,请使用稍显粗略的风格。原创 2024-06-03 11:07:03 · 606 阅读 · 0 评论 -
Go Sync并发包之errgroup
errgroup 软件包可让您同时处理多项任务。通过它,可以轻松地以安全的方式一起运行,保持同步,处理错误,并控制何时停止 goroutines。// 获取用户详细信息return nil})// 获取用户活动return nil})// 获取用户登录详细信息return nil})// 等待所有goroutines完成并返回第一个错误 (如果有)因此,errgroup 的工作就是运行这些任务,并通过g.Wait()等待任务结束,我们需要做的就是添加任务。原创 2024-04-24 11:09:50 · 794 阅读 · 0 评论 -
Golang append是并发安全的吗
Golang append并不是并发安全的,我相信使用过Golang的同学大部分都是知道的,但是他有概率会导致服务crash,这才是更大的风险。转载 2024-02-28 14:10:05 · 245 阅读 · 1 评论 -
Golang 更严格的代码格式化工具 gofumpt
gofmt 是 golang 自带的代码自动格式化工具,是保证 Go 代码风格一致的大杀器。我们这次要推荐的 gofumpt 在 gofmt 的基础上添加了一系列更加严格的格式化规则,并保证了对gofmt 的兼容。gofumpt(https://github.com/mvdan/gofumpt) fork 自 gofmt,支持与 gofmt 几乎相同的命令行参数,因此可以作为 gofmt 的直接替代品使用。gofumpt 是。原创 2024-02-19 20:33:18 · 966 阅读 · 0 评论 -
prometheus node-exporter 全部指标说明
Kswapd_high_wmark_hit_quickly - 剩余内存达到 high 的水位线的时间 /proc/vmstat kswapd_high_wmark_hit_quickly。Kswapd_low_wmark_hit_quickly - - 剩余内存达到 low 的水位线的时间 /proc/vmstat kswapd_low_wmark_hit_quickly。原创 2024-01-19 10:00:02 · 1362 阅读 · 0 评论 -
基于微服务的错误码设计
基于微服务的错误码设计转载 2024-01-11 13:56:57 · 142 阅读 · 0 评论 -
使用 go-elasticsearch v8 基本请求
使用 go-elasticsearch 请求示例找到简单的示例,所以我认为先看看这个是个好主意。连接客户端有两种方式,如下图。至于两者的特点,TypedClient有类型,更容易编写,但文档较少。另外,批量索引不支持TypedClient。由于普通客户端都是基于json的,所以我觉得从文档转换到代码还是比较容易的。我的建议基本上是使用 TypedClient!原创 2024-01-02 16:19:14 · 1100 阅读 · 0 评论 -
Go 代码检查工具 golangci-lint
是一个代码检查工具的集合,聚集了多种 Go 代码检查工具,如golintgo vet等。运行速度快可以集成到 vscode、goland 等开发工具中包含了非常多种代码检查器可以集成到 CI 中这是包含的代码检查器列表:Linters。原创 2023-12-22 11:50:03 · 1794 阅读 · 1 评论 -
Golang常用库:字段参数验证库-validator使用
这个验证包 github.com/go-playground/validator 验证功能非常多。用户自定义函数验证字段是否合法,效验是否正确。import ("fmt"Name string `form:"name" json:"name" validate:"required,CustomerValidation"` //注意:required和CustomerValidation之间不能有空格,否则panic。CustomerValidation:自定义tag-函数标签。转载 2023-11-05 22:56:27 · 944 阅读 · 0 评论 -
使用 grpcurl 通过命令行访问 gRPC 服务
用这个工具做一些简单的测试还是相当方便的,上手也简单。只要掌握文中提到的几条命令,基本可以涵盖大部分的测试需求了。转载 2023-10-23 20:00:00 · 271 阅读 · 0 评论 -
在 Go 使用 embed 当中嵌入父目录中的文件
自 Go 1.16 版本开始,Go 提供了将二进制文件打包进入到 Binary 文件当中的机制:`//go:embed。不过,我看到的示例大多数都是嵌入当前文件夹下的子文件夹的示例。并没有嵌入父一级文件夹的示例。于是,我便开始研究起来。转载 2023-10-07 09:31:55 · 651 阅读 · 0 评论 -
Golang-GJSON 快速而简单的方法来从 json 文档获取值
GJSON 是一个 Go 包,它提供了一种快速而简单的方法来从 json 文档获取值。它具有单行搜索、点符号路径、迭代和解析 json 行等功能。GJSON也可用于和。原创 2023-09-05 18:03:16 · 1197 阅读 · 0 评论 -
Golang-使用 gvm 进行版本控制
当你想为每个项目切换 go 版本时,gvm (Go Version Manager) 很方便。这里,我将介绍“如何在Mac上安装gvm”和“如何使用gvm”原创 2023-08-14 19:30:00 · 1502 阅读 · 0 评论 -
Golang-语言源码级调试器 Delve
GDB最早期的调试工具,现在用的很少。LLDBmacOS 系统推荐的标准调试工具,单 Go 的一些专有特性支持的比较少。Delve专门为 Go 语言打造的调试工具,使用最为广泛。本篇简单说明如何使用Delve工具来调试 Go 程序,使用的delve版本为 1.20.1。delve 的汉语意思是:钻研、探索;用这个来命名一个debug工具还是非常的形象。原创 2023-08-11 15:38:22 · 893 阅读 · 1 评论 -
go mod vendor 依赖管理命令
在 Go 1.11 版本之前,Go 语言使用 GOPATH 环境变量来管理项目的依赖。但是从 Go 1.11 版本开始,引入了 Go Modules 的概念,可以更方便地管理项目的依赖关系。当你的项目使用 Go Modules 进行依赖管理时,可以使用r 命令将项目依赖的模块复制到vendor目录下。这样做的好处是,可以将项目所需的依赖模块与项目代码一起打包,使得项目更加独立和可移植。原创 2023-07-26 01:11:21 · 1987 阅读 · 0 评论 -
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库
Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库,基于 ECMA-376,ISO/IEC 29500 国际标准。可以使用它来读取、写入由 Microsoft Excel™ 2007 及以上版本创建的电子表格文档。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,高度兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。可应用于各类报表平台、云计算、边缘计算等系统。原创 2023-07-01 19:32:28 · 833 阅读 · 0 评论 -
「Go开源包」chromedp:一个基于Chrome DevTools协议的库,支持数据采集、截取网页长图
chromedp基于Chrome DevTool协议实现。可以对网页内容进行采集、模拟点击、提交数据、将网页内容转换成pdf、抓取网页长图等功能。转载 2023-06-28 10:53:14 · 2394 阅读 · 0 评论 -
Golang-Ent ORM框架
面向对象编程和关系型数据库,都是目前最流行的技术,但是它们的模型是不一样的。面向对象编程把所有实体看成对象(object),关系型数据库则是采用实体之间的关系(relation)连接数据。很早就有人提出,关系也可以用对象表达,这样的话,就能使用面向对象编程,来操作关系型数据库。简单说,ORM 就是通过实例对象的语法,完成关系型数据库的操作的技术,是"对象-关系映射"(Object/Relational Mapping) 的缩写。ORM 把数据库映射成对象。转载 2023-06-26 14:27:00 · 1720 阅读 · 0 评论 -
探究|Go JSON 三方包哪家强?
综上,业务选型上需要根据具体情况、不同领域的业务使用场景和发展趋势进行选择,综合考虑各方面因素。最适配业务的才是最好的!例如:如果业务只是简单的解析 http 请求返回的 json 串的部分字段,并且字段都是确定的,偶尔需要搜索功能,那 Gjson 是很不错的选择。不太推荐使用 Jsoniter 库,原因在于: Go 1.8 之前,官方 Json 库的性能就收到多方诟病。不过随着 Go 版本的迭代,标准 json 库的性能也越来越高,Jsonter 的性能优势也越来越窄。转载 2023-06-14 09:55:38 · 275 阅读 · 0 评论 -
Go工程化 - 依赖注入
在微服务框架的默认项目模板中使用了进行依赖注入,也建议开发者在维护项目时使用该工具。wire 乍看起来比较违反直觉,导致很多同学不理解为什么要用或不清楚如何用(也包括曾经的我),本文来帮助大家理解 wire 的使用。转载 2023-06-12 14:38:31 · 235 阅读 · 0 评论 -
Golang-依赖注入最佳指南
依赖注入是一种设计模式,用于管理对象之间的依赖关系。依赖注入的核心思想是将对象的依赖关系从代码中分离出来,从而使代码更加灵活和可维护。在依赖注入中,对象不再负责创建它所依赖的对象,而是由外部容器来负责创建和管理对象之间的依赖关系。可以更轻松地推理代码中的数据流,因为依赖项显式传递给函数或构造函数。管理依赖项可能更容易,尤其是在较小的代码库中。测试依赖于手动依赖项注入的代码可能更容易,尤其是在依赖项彼此松散耦合的情况下。在整个代码库中手动实例化和注入依赖项可能很乏味且容易出错。转载 2023-06-02 09:41:29 · 1897 阅读 · 0 评论 -
Golang-GEN 自动生成 GORM 模型结构体文件及使用示例
GEN 是一个基于 GORM 的安全 ORM 框架, 由字节跳动无恒实验室与 GORM 作者联合研发,主要功能说白了就是帮助生成数据表对应的模型文件和更安全方便地执行SQL。转载 2023-05-29 17:49:25 · 3764 阅读 · 0 评论 -
Golang-循环变量作用域针对那些数据类型会出现问题
这个代码的输出结果是 “321”,因为 defer 语句在函数返回前执行,所以闭包捕获的都是同一个循环变量的地址。这个代码的输出结果是 “321”,因为 defer 语句在函数返回前执行,所以协程捕获的都是同一个循环变量的地址。输出结果为 “333”,这是因为函数字面量捕获的是变量 i 的地址,而 i 的值在循环结束后一直是 3。输出结果是 “012”,这是因为指针类型数据结构保存的是 j 的地址,每个元素访问的是自己所指向的值。输出结果为 “333”,因为协程访问的是循环变量的地址,而不是值。原创 2023-05-23 09:52:06 · 390 阅读 · 0 评论 -
Golang-使用 Hertz 框架和 Gorm 快速搭建 Web 服务
在之前的文章中咱们运用 Hertz 编写了一个简略的 demo 协助快速上手 Hertz 这款 Golang HTTP 结构,本节咱们将加入 Gorm 结构和 Hertz 结构一起学习一个简略的官方 demo,同时带你了解 Hertz 一些有意思的特性。假如你还不知道 Hertz 是什么,那么能够查看我之前的文章快速上手。运用 thrift IDL 界说 HTTP 接口运用hz生成脚手架代码运用Hertz的参数绑定校验运用Gorm和MySQL编写耐久层这就是本文的全部内容。转载 2023-05-11 17:00:52 · 796 阅读 · 2 评论 -
Golang-使用 goroutine 运行闭包的“坑”
在 Go 语言中,函数支持匿名函数,闭包就是一种特殊的匿名函数,它可以用于访问函数体外部的变量。需要注意的是,在中,使用goroutine执行闭包时,经常会掉“坑”。因为匿名函数可以访问函数体外部的变量,而返回的val 的值是引用的同一个内存地址的数据,所以匿名函数访问的函数体外部的 val 值是循环中最后输出的一个值。本文我们介绍了在中,Go 语言在每次迭代时没有定义一个新变量,导致使用 goroutine 运行闭包时,经常会掉“坑”。我们给出避免“踩坑”的两种方法,其中,第二种方法更简单。转载 2023-05-11 10:28:13 · 158 阅读 · 0 评论 -
Golang-常见数据结构Map
开放寻址法中对性能影响最大的就是装载因子,它是数组中元素的数量与数组大小的比值,随着装载因子的增加,线性探测的平均用时就会逐渐增加,这会同时影响哈希表的读写性能,当装载率超过 70% 之后,哈希表的性能就会急剧下降,而一旦装载率达到 100%,整个哈希表就会完全失效,这时查找任意元素都需要遍历数组中全部的元素,所以在实现哈希表时一定要时刻关注装载因子的变化。如上图所示,当 Key3 与已经存入哈希表中的两个键值对 Key1 和 Key2 发生冲突时,Key3 会被写入 Key2 后面的空闲内存中;原创 2023-04-30 10:26:21 · 1312 阅读 · 0 评论 -
Golang-常见数据结构Slice
切片是对底层数组的一个抽象,描述了它的一个片段。切片实际上是一个结构体,它有三个字段:长度,容量,底层数据的地址。多个切片可能共享同一个底层数组,这种情况下,对其中一个切片或者底层数组的更改,会影响到其他切片。append 函数会在切片容量不够的情况下,调用 growslice 函数获取所需要的内存,这称为扩容,扩容会改变元素原来的位置。扩容策略并不是简单的扩为原切片容量的 2 倍或 1.25 倍,还有内存对齐的操作。扩容后的容量 >= 原容量的 2 倍或 1.25 倍。原创 2023-04-30 10:23:23 · 925 阅读 · 0 评论 -
一份 Go 开发者学习路线图
Go 开发者路线图原创 2023-04-25 09:58:34 · 212 阅读 · 0 评论 -
Golang 简洁架构实战
以上就是我对 golang 的项目中发现问题的一点点总结与思考,思考的先不管对不对,总归是解决了我们当下的一些问题。不过,项目总归是需要不断重构完善的,所以下次有问题的时候下次再改呗。对于我上面的总结和描述感觉有不对的地方,请随时指出来一起讨论。转载 2023-04-17 09:41:55 · 323 阅读 · 0 评论 -
go-zero 微服务集成 consul 注册发现和配置中心
最近在开发学习go-zero时发现基于ETCD做服务发现, 做配置中心相关资料较少, 需要做二次开发. 也调研尝试了一些注册发现组件 consul 和 nacos 等, 从资源使用上 consul 相对占用资源小太多了. 比较 nacos 是阿里基于 java 开源的.原创 2023-04-14 14:29:19 · 900 阅读 · 0 评论 -
Golang-GMP模型
Go 为了自身 goroutine 执行和调度的效率,自身在 runtime 中实现了一套 goroutine 的调度器,下面通过一段简单的代码展示一下 Go 应用程序在运行时的 goroutine,方便大家更好的理解。for i := 0;i < 4;i ++ {5说明当前这个应用程序中存在goroutine的数量是5,事实上也符合我们的预期。原创 2023-03-10 10:55:40 · 455 阅读 · 0 评论 -
Filebeat轻量型日志采集器-自定义processors处理器
filebeat通常以配置文件的方式加载插件。让定义一下自定义配置。filebeat.inputs : - type : log paths : - example/example.log processors : # 自定义处理器插件 - parse_text : file_has_suffix : example.log output.console : pretty : true。原创 2023-02-26 22:07:37 · 1496 阅读 · 0 评论 -
Golang-数组与切片常见错误及陷阱
值得注意的是,不管传的是 slice 还是 slice 指针,如果改变了 slice 底层数组的数据,会反应到实参 slice 的底层数据。若传的是 slice 的指针,在调用者看来,是会被改变原 slice 的。在 Go 中,数组是不常见的,因为其长度是类型的一部分,限制了它的表达能力,比如 [3]int 和 [4]int 就是不同的类型。myAppend 函数里,虽然改变了 s,但它只是一个值传递,并不会影响外层的 s,因此第一行打印出来的结果仍然是 [1 1 1]。容量刚好够,直接追加。原创 2023-02-15 17:43:05 · 668 阅读 · 0 评论 -
go-zero:开箱即用的微服务框架
goctl 是 go-zero 微服务框架下的代码生成工具。使用 goctl 可显著提升开发效率,让开发人员将时间重点放在业务开发上。goctl 的命令可归纳为如下几类:API 命令,快速生成一个 API 服务rpc 命令,支持 proto 模板生成和 rpc 服务代码生成model 命令,目前支持识别 mysql ddl 进行 model 层代码生成plugin 命令,支持针对 API 自定义插件其他命令,目前是发布相关。转载 2023-01-13 14:09:29 · 873 阅读 · 0 评论 -
开箱即用的微服务框架 Go-zero(进阶篇)
之前我们简单介绍过 Go-zero 详见《Go-zero:开箱即用的微服务框架》。这次我们从动手实现一个 Blog 项目的用户模块出发,详细讲述 Go-zero 的使用。特别说明本文涉及的所有资料都已上传 Github 仓库 “kougazhang/go-zero-demo”, 感兴趣的同学可以自行下载。转载 2023-01-13 14:10:14 · 2094 阅读 · 0 评论 -
Golang: 值传递还是引用传递
本部分引用 Go 官方 FAQ 的 “When are function parameters passed by value?”,内容如下。如同 C 系列的所有语言一样,Go 语言中的所有东西都是以值传递的。也就是说,一个函数总是得到一个被传递的东西的副本,就像有一个赋值语句将值赋给参数一样。传值的意思是:函数传递的总是原来这个东西的一个副本,一副拷贝。其指的是在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。原创 2023-01-09 18:03:16 · 508 阅读 · 0 评论 -
减小 Go 代码编译后的二进制体积
减小编译后的二进制的体积,能够加快程序的发布和安装过程。使用编译选项后,体积从原来的 9.8M 下降了 20% 到 7.8M,使用 upx 压缩后,体积进一步下降 60% 到 3M。累进下降约 70%。如果对编译后的体积没什么要求的情况下,可以不使用 upx 来压缩。可以看到,使用 upx 后,可执行文件的体积从 9.8M 缩小到了 5M,缩小了 50%。是一个常用的压缩动态库和可执行文件的工具,通常可减少 50-70% 的体积。接下来,我们看一下,如果只使用 upx 压缩,二进制的体积可以减小多少呢。原创 2023-01-03 00:07:34 · 1045 阅读 · 1 评论 -
入门篇:从 etcd 名字的由来,到安装部署和使用姿势
当然,也有其他组件可以提供配置共享和服务注册和发现的功能,比如最为广泛和大家最为熟知的 Zookeeper,也被很多 Java 系的知名开源项目认可和使用,比如:Hadoop、HBase、Kafka 等。该脚本创建包含 3 个 etcd 成员节点的集群,每个集群成员都接收键值的读取和写入。以上,就是今天的全部内容,几乎包含了 etcd 安装和使用的各种姿势,欢迎各位号友敬请尝试。当一个 key 被绑定到一个租约上时,它的生命周期与租约的生命周期即绑定。注:运行过程中,可能会涉及权限问题,授权即可。转载 2022-12-20 09:48:53 · 472 阅读 · 0 评论 -
手撸源码系列 - cache2go
cache2go 是一个并发安全、带有自动过期机制的缓存库。通过阅读源码我们可以掌握:作者是如何维护缓存数据的;作者是如何使用 sync.RWMutex 保证并发安全,有哪些值得借鉴的技巧;自动过期机制是如何实现的(这块代码思路值得学习);这个库还提供了如下功能:可以配置添加、删除、访问数据时的回调函数;为每个 item 单独设置存活时间;记录每个 item 的最近访问时间、创建时间、访问次数等;按照访问次数排序;转载 2022-11-05 13:00:43 · 75 阅读 · 0 评论 -
深入 Go 并发原语 — Channel 底层实现
作为 Go 并发原语的第一篇文章,一定绕不开 Go 的并发哲学。从 Tony Hoare 写的 Communicating Sequential Processes 这篇文章说起,这篇经典论文算是 Go 语言并发原语的根基。转载 2022-11-03 18:28:54 · 796 阅读 · 1 评论