- 博客(1114)
- 收藏
- 关注
转载 几种Go版本管理工具
缘起:编译下面这段代码时,在Mac上没有什么问题,正常运行,点击查看代码:packagemainimport("bytes""encoding/binary""encoding/json""fmt""log""math/rand""net/http""time")funcmain(){http.HandleFunc("/register",...
2023-09-28 08:03:30
5
转载 go vet中的那些检测项
go vet 是 Go 语言自带的一个工具,用于分析 Go 代码中的常见错误和潜在bug。它可以检查代码中可能存在的各种问题,例如:未使用的变量、函数或包可疑的函数调用错误的函数签名程序中的竞态条件错误的类型转换等本文意图列出当前go tools项目中提供的所有检测项及其作用目前tools中的分析器,集成到go vet的只有30个,很多可能因为噪音(误报)太多,而没有加进去Run 'go help...
2023-09-26 08:02:23
13
转载 Go 语言如何获取 CPU 利用率
概述 Go 语言标准库没有提供获取 CPU 利用率的方法,如果业务开发中需要用到一些服务器性能指标数据,必须由开发者自己实现。本文主要介绍在 Linux 中如何获取 CPU 利用率,笔者的示例代码运行环境为 go1.20 linux/amd64。 命令行工具 Linux 中常见的命令如 top、htop、sar, 可以非常方便地获取和显示 CPU 利用率等数据,下面是 top 命令的结果输出。t...
2023-09-21 08:00:00
26
转载 使用Singleflight优化Go代码
介绍有许多方法可以优化代码以提高效率,减少运行进程就是其中之一。在本文中,我们将看到如何通过使用一个Go包Singleflight来减少重复进程,从而优化Go代码。问题假设你有一个web应用,它每秒有10个请求(RPS)。根据您所知道的数据,其中一些请求具有相同的模式,实际上可以生成相同的结果,这意味着实际上存在冗余流程。从上面的插图中,我们知道用户1和用户2想要相同的东西,但最终,我们(大多数情...
2023-09-19 08:03:25
32
转载 用 Go 编写简洁代码的最佳实践
介绍简洁的代码对于创建可维护、可阅读和高效的软件至关重要。Go 是一种强调简单和代码整洁的语言。在本文中,我们将结合代码示例,探讨编写简洁 Go 代码的最佳实践。有意义的变量和函数名称使用能表达变量和函数用途的描述性名称。避免使用隐晦或过于简短的名称。// Bad:func fn(x int) int { // ...}// Good:func calculateFactoria...
2023-09-14 08:00:59
38
转载 Go几种读取配置文件的方式
比较有名的方案有使用viper管理配置[1]支持多种配置文件格式,包括 JSON,TOML,YAML,HECL,envfile,甚至还包括Java properties支持为配置项设置默认值可以通过命令行参数覆盖指定的配置项支持参数别名viper[2]按照这个优先级(从高到低)获取配置项的取值:explicit call to Set: 在代码逻辑中通过viper.Set()直接设置配置项的值fl...
2023-09-12 08:02:49
44
转载 Golang实用进阶工具
gotests[1]Generate Go tests from your source code.goget-ugithub.com/cweill/gotests/...gotests -hUsageofgotests:-allgeneratetestsforallfunctionsandmethods-exclstring...
2023-09-05 08:00:36
43
转载 慎写指针类型的全局变量
简述:在 关于range二三事[1] 第二个case中,介绍了对于指针类型的 切片/map变量A 的循环,要格外注意, 迭代出的value作用域是整个方法而非循环体内.改进办法:在循环体中引入中间变量,"暂存"下每次迭代的value的值但对于这个A,如果是全局变量,则又极有可能出现问题:packagemainimport("fmt")typeUserInfostruct{...
2023-09-01 08:01:21
31
转载 借助gopsutil库,获取机器相关信息
使用github.com/shirou/gopsutil/disk这个库,如何获取机器下不同磁盘分区的内容使用 github.com/shirou/gopsutil/disk 库获取机器下不同磁盘分区的内容,可按如下:import"github.com/shirou/gopsutil/disk"//调用disk.Partitions()函数获取机器下所有磁盘分区的信息:partitio...
2023-08-29 08:01:06
43
转载 Go异常处理机制panic和recover
来源:旅途散记recover使用panic抛出异常后, 将立即停止当前函数的执行并运行所有被defer的函数,然后将panic抛向上一层,直至程序crash。但是也可以使用被defer的recover函数来捕获异常阻止程序的崩溃,recover只有被defer后才是有意义的。funcmain(){print(123)print(456)panic("throwanerror...
2023-08-25 13:10:26
43
转载 zap 高性能设计与实现
概述 zap 是 Uber 开源的 Go 高性能日志库,性能远超于标准库和其他开源日志库。zap 使用简单,支持多种格式结构化日志、可以设置不同的日志级别,并且能够在堆栈跟踪中记录调用者信息。为什么要使用 zap功能/库标准库 logzap日志级别只有 Print 在生产可用,因为 Fatal 级别会终止进程,Panic 级别会抛出 panic支持多种日志级别日志结构化 仅支持简单本...
2023-08-22 08:04:05
41
转载 Go中的匿名函数与闭包
关键词: 函数式编程 闭包 匿名函数 匿名函数特别适合作为函数或方法的回调 在Go中函数是一等公民,和string,int等一样。而在C、C++ 等不支持匿名函数的语言中,函数不能在运行期创建go 学习笔记之仅仅需要一个示例就能讲清楚什么闭包题图来自https://www.meetgor.com/golang-closures/闭包 与 普通函数的区别在(普通)函数里面定义一个内部函...
2023-08-17 08:00:55
41
转载 Go 语言中的零拷贝
传统读写模式 传统读写模式流程图第一次数据拷贝: 用户进程发起 read() 系统调用,当前上下文从用户态切换至内核态,DMA(Direct Memory Access) 引擎从文件中读取数据,并存储到内核态缓冲区 (DMA 拷贝)第二次数据拷贝: 将数据从内核态缓冲区拷贝到用户态缓冲区 (CPU 拷贝),然后返回给用户进程,拷贝数据时会发生一次上下文切换 (从内核态切换到用户态)第三次数据拷贝...
2023-08-15 08:00:46
70
转载 Asynq: 基于Redis实现的Go生态分布式任务队列和异步处理库
Asynq[1]是一个Go实现的分布式任务队列和异步处理库,基于redis,类似Ruby的sidekiq[2]和Python的celery[3]。Go生态类似的还有machinery[4]和goworker同时提供一个WebUI asynqmon[5],可以源码形式安装或使用Docker image, 还可以和Prometheus集成docker run --rm --name asynqmon...
2023-08-11 08:03:37
76
转载 Go 性能分析工具从入门到精通
概述 Go 语言自带的 pprof 是一种性能分析工具,用于帮助开发者分析和优化程序的性能,它可以提供关于 CPU 耗时、内存分配、网络 IO、系统调用、阻塞等待等方面的详细信息。 快速开始 我们来通过一个小例子直观的感受下 pprof 的使用方法,本文所有示例代码运行环境是 go1.20 darwin/arm64。示例程序packagemainimport("bytes""lo...
2023-08-07 08:01:09
63
转载 Go项目实现日志按时间及文件大小切割并压缩
关于日志的一些问题:单个文件过大会影响写入效率,所以会做拆分,但是到多大拆分? 最多保留几个日志文件?最多保留多少天,要不要做压缩处理?一般都使用 lumberjack[1]这个库完成上述这些操作lumberjack//info文件writeSyncerinfoFileWriteSyncer:=zapcore.AddSync(&lumberjack.Logger{Filena...
2023-08-04 08:00:40
147
转载 微服务中的熔断算法
雪崩效应 在微服务系统中,整个系统是以一系列功能独立的微服务组成,如果某一个服务,因为流量异常或者内部其他原因,导致响应异常,那么该服务会影响到其下游服务,从而发生一系列连锁反应,最终导致整个系统崩溃,这就是微服务中的 雪崩效应。例如:当前系统中有 A,B,C 三个服务,服务 A 是上游,服务 B 是中游,服务 C 是下游。一旦下游服务 C 变得不可用,积压了大量请求,服务 B 的请求也随之阻...
2023-08-02 08:01:29
48
转载 使用位图进行范围查询
FeatureBase 将整型数值存储在二进制, 范围编码(Range-Encoded), 位切片索引(Bit-sliced Indexes)中,这篇博客分析了全部的实现。引言FeatureBase 是围绕着将所有内容表示为 bitmap 的概念构建的。对象之间的联系,例如,被视为 bool 值-关系存在或不存在-这些 bool 值的集合被存储为一系列 0 和 1。这些 bool 集合是 bitm...
2023-07-31 08:00:57
48
转载 漏桶算法和令牌桶算法
概述 限流的目的 是通过对并发请求进行限速来保护系统,请求一旦达到限制速率,就可以选择性地拒绝服务,例如下面的几种方案:提示用户系统繁忙,请稍后重试提示用户进入排队等待跳转到指定页面....漏桶 算法和 令牌桶 算法是 接口限流设计 中常用的两种算法,本文通过两个常用的开源组件,研究下两者的区别和具体代码实现。 漏桶 漏桶 算法将 服务的请求量限额 比喻为一个一直装满水的桶,每隔固定时间向外漏 N...
2023-07-27 08:03:48
74
转载 jsonparser 为什么比 encoding/json 快 10 倍 ?
概述 jsonparser 是一个开源 JSON 包,号称比标准库 JSON 包性能高 10 倍 (具体情况取决于具体的负载大小和数据情况),内存分配优化到 0。项目的目标是在不牺牲开发者用户体验和保持包 API 简洁的前提下,尽可能地提升 JSON 操作的性能。 基准测试 官方给出了 3 种类型 的基准测试结果,分别是 少量数据、中等数据 和 大量数据 情况下的 JSON 负载。jsonpar...
2023-07-25 08:00:55
63
转载 Go Toolchains
介绍从 Go 1.21 开始,Go 发行版由一个 go 命令和一个捆绑的 Go 工具链组成,其中包括标准库以及编译器、汇编器和其他工具。go 命令可以使用其捆绑的 Go 工具链以及在本地 PATH 中找到或根据需要下载的其他版本。当前使用的 Go 工具链的选择取决于 GOTOOLCHAIN 环境设置以及主模块的 go.mod 文件或当前工作区的 go.work 文件中的 go 和 toolchai...
2023-07-21 08:00:17
112
转载 【官宣】GopherChina大会(上海站)议题火热征集中
亲爱的 Gopher 们,我们有一个重要的消息告诉大家。从今年开始,我们将会把 GopherChina 大会拆分成北京场和上海场。GopherChina 大会是 GoCN 社区的重要活动,是 Gopher 们交流思想、分享知识、建立联系的平台。然而,随着社区的发展,一年一度的大会已经无法满足大家的需求。我们有太多的议题要讨论,太多的知识要分享,太多的声音要被听见。这个决定的背后,是我们对于知识分享...
2023-07-19 08:41:42
67
转载 HTTP Router 算法演进
概述 本文从开发中常见的应用场景 “路由管理” 为例,介绍三种常用的实现方案背后的数据结构和算法 (代码实现为 Go 语言)。 应用示例 下面是一个典型的 REST 风格的 API 列表:MethodURLGET/users/listGET/users/dbwuPOST/usersPUT/users/dbwuDELETE/users/dbwu上面的 API 翻译为 Go 代码,大致如下 (忽略方...
2023-07-18 09:00:29
44
转载 ants Code Reading
概述 goroutine 使用简单,但并不意味着没有成本。ants 是一个高性能且低损耗的 goroutine 池,组件内部会创建一个固定容量的 goroutine 池,并且管理和回收池中的 goroutine,主要应用场景是允许开发者限制并发程序中的 goroutine 数量,更多的特性介绍请参考 Github 主页[1]。 示例代码 我们首先通过两个示例程序来直观地感受一下使用 gorou...
2023-07-14 09:00:50
31
转载 基于Go语言的滴滴DevOps重塑之路
研发效率和系统稳定性是研发团队永远无法绕开的话题,前者决定业务迭代效率,而后者决定交付质量。多年来,滴滴在保障稳定性的前提下不断探索更高效的技术手段,积累了大量实践经验。近期由网约车研发效率与稳定性负责人魏静武在Gopher China上分享了滴滴在相关领域的实践。以下为演讲实录。很多技术同学或许都有过类似经历:处理故障的过程中除了要承受巨大压力之外,还会承受来自业务方新需求上线的压力。似乎稳定性...
2023-07-12 09:07:19
79
转载 fastcache 高性能设计与实现
概述 fastcache 是一个线程安全并且支持大量数据存储的高性能缓存组件库。这是官方 Github 主页上的项目介绍,和 fasthttp 名字一样以 fast 打头,作者对项目代码的自信程度可见一斑。此外该库的核心代码非常轻量,笔者本着学习的目的分析下内部的代码实现。 基准测试 官方给出了 fastcache, bigcache, 标准库 map, sync.Map 的基准测试比较结果。...
2023-07-10 08:00:23
65
转载 在本地构建你的 Golang 包文档
编写 Golang 文档最近我专注于 eBPF,需要写比以前更多的东西。这也意味着要为各种生态系统撰写文档。虽然某些工具在作者完成工作时产生阻力,但本文介绍我目前为编写 Golang 文档而设置的工作流程。godoc 已被弃用与我的 Rust 设置类似,我想在发布之前本地查看我的模块文档在 pkg.go.dev 上的呈现方式。这是可能的,但自那时起 godoc 就已被弃用,没有官方解决方案。现在的...
2023-07-07 13:34:18
78
转载 死锁、活锁、饥饿、自旋锁
死锁 指两个或多个进程因互相持有对方所需的资源而处于等待状态,从而导致程序停止运行的现象。简单来说,在一个系统中,如果进程之间形成了一个循环依赖关系,那么就会发生死锁。图片来源: https://www.scientecheasy.com/2020/08/deadlock-in-java.html/???? 本文所有代码实现语言为 Go, 其他语言的读者可以使用读伪代码的思路来阅读代码,主要目的在于理...
2023-07-05 13:16:12
90
转载 The State Of Go 2023
原文链接:The State Of Go 2023GopherChina 2023技术大会在北京圆满落幕啦。我本人有幸收到会议组办方的邀请,在此次大会担任会前“Go高级工程师训练营”的讲师以及主论坛分享嘉宾,在这次大会上分享了THE STATE OF GO的主题演讲。这个演讲内容聚焦于Go 1.20以来Go语言的主要演讲点,覆盖了正在开发的Go 1.21版本的主要功能。Go 1.21版本预计在20...
2023-07-03 13:15:57
42
转载 sync.Pool 高性能设计之集大成者
概述 sync.Pool 是 Go 语言标准库中的一个并发安全的对象池,可以用来缓存那些需要重复创建和销毁的对象,从而避免频繁地进行内存分配和回收,降低内存和 GC 压力。需要注意的是: 任何存储在对象池中的元素可能会被随时删除,如果元素是一个资源类的引用,并且该资源仅在对象池中被引用 (没有其他地方引用了),那么当该元素被对象池删除时,其指向的资源同时也会被释放。 内部实现 sync.Pool...
2023-06-29 14:05:18
74
转载 Go 中线程安全 map 方案选型
概述 Go 语言标准库中的 map 数据类型并不是线程安全的,多个 goroutine 可以并发读取同一个 map, 但是不能并发写入同一个 map, 否则会引发 panic。为了解决这个问题,实际开发中通常会使用下面的三种方案中的一个或多个:通过 map 数据类型 + 锁 (互斥锁, 读写锁)标准库内置的 sync.Map 对象 (支持并发读写)分段锁作为补充,本文会顺带对比一下自旋锁和标准库...
2023-06-27 13:17:11
248
转载 Go 泛型的二十一个陷阱
选自GopherChina 2023大会的分享《谈谈go泛型》。完整ppt在 gopherchina/conference ,代码在 github.com/smallnest/talk-about-go-generics.想要了解Go更多内容,欢迎扫描下方????关注公众号,回复关键词 [实战群],就有机会进群和我们进行交流分享、在看与点赞Go...
2023-06-25 11:01:00
47
转载 瞬间高并发,goroutine执行结束后的资源占用问题
问题当Go系统遭遇突增流量,洪峰过境,流量恢复正常后,整个系统的资源消耗是否会变大?第一反应,应该是会恢复到之前的水平吧!资源消耗在流量恢复正常之后,为什么会变大呢...复现模拟一下该场景。我们知道Go原生的网络模型goroutine-per-connection,即一个连接分配一个goroutine去处理。当流量突增,瞬间高并发,很有可能使协程数量也同步增加。即如:原本正常流量情景下,有1000...
2023-06-21 12:00:37
149
转载 在Gopher 大会上,我们做了一个K8s Operator使用情况的小调查,没想到结果竟然是这样!!!...
6月11日,Gopher大会胜利召开,每个开发者都收获满满。云猿生数据作为Gopher China本次大会的合作伙伴,也非常荣幸的参与了本次大会。在会上,云猿生数据联合创始人&CTO,前阿里云数据库研发总监,云数据库架构师,蔡松露针对K8s上的运行数据库的话题进行了题为《KubeBlocks - A domain-driven design operator for stateful wo...
2023-06-19 11:03:17
349
转载 Go netpoll (下篇)- 数据接收发送和关闭
接收 TCP 连接流程 TCP 连接对象typeTCPConnstruct{conn}typeconnstruct{fd*netFD}Conn 接口Conn 表示通用的面向流的网络连接。typeConninterface{Read(b[]byte)(nint,errerror)Write(b[]byte)(nint,errerr...
2023-06-16 15:02:11
100
转载 参加GopherChina 2023大会的感觉真是泰酷辣!(文末附PPT 下载)
原文链接:参加GopherChina 2023大会的感觉真是泰酷辣!(文末附PPT 下载)周末两天结束,GopherChina 2023大会也在北京圆满落幕作为台下观众,我认为大赛非常给力,同事讲的也非常给力当然最给力的还属我自己,成功了抽到了隔壁展台的特等奖其实我是来秀奖品的真的是骚气满满图片没看够的可以看这里https://live.photoplus.cn/live/pc/242113...
2023-06-15 12:43:30
121
转载 Go netpoll (上篇)- 数据结构和初始化
概述 下面是一个基础的服务器网络程序,主要包含如下功能:监听 TCP 连接,绑定 8888 端口收到新的客户端连接后,启动一个新的 goroutine 进行处理收到客户端的数据后,不做任何处理,原样返回packagemainimport("log""net")funcmain(){//初始化监听listener,err:=net.ListenTCP("tc...
2023-06-13 17:00:35
37
转载 直播:GopherChina 2023 亮点抢先看-- 业务架构
????我在这儿今年的 GopherChina大会 总计设有 8 场分论坛,包括 Go 企业级应用专场、Go 语言组件应用专场、基础工具链专场、开源生态专场、云原生专场及业务架构专场等业务架构专场中涵盖了基于 Prometheus 的 SLO告警实战、基于Golang的分布式数据运营与流式计算实战、基于Go构建海量作业平台今天我们邀请到了业务架构专场的各位讲师来到直播间,为大家介绍本次大会演讲主题的精...
2023-06-07 16:32:18
176
转载 channel 的 15 条规则和底层实现
GopherChina2023大会倒计时3天!本次大会邀请到了来自多家顶尖技术平台、企业和开发行业的资深专家及研发工程师们。针对当下最前沿的技术发展趋势与应用案例,分享他们多年积累的 Go 语言操作实战经验、项目开发经验、Go 项目设计经验及相关理论知识等。大会干货满满,千万别错过!抓紧最后的时间报名啦!!(详细信息请参考文末的阅读原文)概述 下面表格中的内容是 Go 语言中 channel 数据...
2023-06-06 12:50:34
89
转载 Gopher China 2023 现场招聘会就等你来~
????我在这儿Gopher China 2023 大会现场招聘Golang相关岗位啦!!由于首次尝试增设招聘展位,因此本次大会只有一个招聘展位,我们从众多合作伙伴中筛选了以下4家招聘企业:美餐、 矩阵起源、滴滴、七猫。包含:AWS 运维工程师、基础组件开发工程师、Web 后端开发工程师、向量引擎研发工程师、测试开发工程师、SRE工程师等相关岗位,工作地点分布在北京、上海、深圳。具体详细信息欢迎各位go...
2023-06-03 08:02:22
177
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人