自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Seekload

个人主页 seekload.net,公众号「Golang来啦」,编程·生活·认知

  • 博客(509)
  • 资源 (1)
  • 收藏
  • 关注

原创 Go1.20 新特性:切片转数组

Go1.20 正式版本还没有发布,官方计划 2023 年 2 月份发布。不过,Go1.20rc 已经在 12 月 8 号发布了,一起来尝鲜。语言特性方面主要有四个优化,其中最主要的添加了 切片转数组 功能。其实在 Go1.17 版本,Go语言已经有 切片转数组指针 的功能。可以看 P 神的这篇文章,了解下详情。引入 切片转数组指针 特性之后,bradfitz 在改造标准库时就有了下面这次更改:【截图】但是在代码 review 时,他发现这样写有点“丑”,需要先取得数组指针再解引用,然后返回数组。

2022-12-10 11:16:48 1248 1

转载 Go 凭什么搞特殊?不用 yyyy-mm-dd,非得要 2006-01-02 15:04:05。。。

前段时间我写了一篇《Go1.20 中两个关于 Time 的更新,终于不用背 2006-01-02 15:04:05 了!》,文中有提到 Go 的参考时间格式是:2006-01-02 15:04:05,并解释这么设计的缘由。有很多同学表示不解。如下图:甚至我在点外卖时还特意看了,某团在个人信息页中的生日那一栏,是如此显示的:那熟悉的 yyyy-mm-dd。我甚至一度怀疑这是不是彩蛋,这可能只有程序员...

2022-12-06 09:37:14 410

转载 三种获取Go项目根目录的方式,让你做架构,选哪种?

在搭建项目中一般都会有确定项目根目录的绝对路径的需求,一旦有了根目录的绝对路径,就能以这个根目录为基准,设置静态文件、配置文件所在的目录,这样做的好处是无论把项目部署到哪个目录下,执行程序时都不会出现No such file or directory这样的错误。今天就总结一下在 Go 程序里边怎么获取项目的根目录绝对路径。在网上搜索怎么获取 Go 项目的根目录,一般有三种,分别依赖 Go 的以下...

2022-12-03 11:50:54 767

转载 「Go工具箱」web中的session管理,推荐使用gorilla/sessions包

在web开发中,大家一定会使用到session。在go的很多web框架中并没有集成session管理的中间件。要想使用session功能,我推荐大家使用这个包:gorilla/sessions。以下是该包的基本情况:sessions小档案star2.5kused by11.5kcontributors50作者gorilla功能简介该包提供了web开发中对session的实现。session的数据能...

2022-12-01 08:20:11 823

转载 PGO 是啥,咋就让 Go 更快更猛了?

Go1.20 即将发布,近期很多大佬提到一个关键词 PGO,说是有很大的提高,很猛...称其为本迭代(Go1.20)最大的功能特色,这个饼让我一愣一愣,不禁思考是什么,咋就很快了。今天就由煎鱼和大家一起学习这个新特性。快速了解PGO 是什么Profile-guided optimization (PGO),翻译过来是使用配置文件引导的优化。也被称为:profile-directed feedbac...

2022-11-30 08:20:42 1028

转载 深度解密Go语言之Slice

Go 语言的slice很好用,不过也有一些坑。slice是 Go 语言一个很重要的数据结构。网上已经有很多文章写过了,似乎没必要再写。但是每个人看问题的视角不同,写出来的东西自然也不一样。我这篇会从更底层的汇编语言去解读它。而且在我写这篇文章的过程中,发现绝大部分文章都存在一些问题,文章里会讲到,这里先不展开。我希望本文可以终结这个话题,下次再有人想和你讨论slice,直接把这篇文章的链接...

2022-11-23 08:20:50 221

转载 用 Go interface{} 等于什么也没说

如果说在 Go 里要有一句与 interface{} 相关,你会想到什么?是万物皆要定义 interface,否则没法抽象?Go 谚语中认可的是:"interface{} says nothing",也就是 interface{} 什么也没说。这指的又什么,太黑话了吧...今天就煎鱼和大家一起学习。接口类型无自描述interface{} 的第一种用法,那就是变量的数据类型声明。结合其它语言来看,一...

2022-11-22 10:15:38 106

转载 用Go学设计模式-提炼流程,减少重复开发就靠它了!

今天继续来给大家更新设计模式系列的文章,之前已经把四种建造型的设计模式更新齐全啦,没有看过的小伙伴可以通过点击上面和文章尾部的系列合集链接,进行查看。从今天开始未来的三篇设计模式系列文章,我们学的设计模式在项目开发中应用率非常高,尤其是应对业务系统的重复开发率高、流程无兜底策略、产品需求无序扩展这几个痛点上非常有用。那在这里我先抛出一个我自己总结的暴论:“模板、策略和职责链三个设计模式是解决业务系...

2022-11-21 09:09:04 150

转载 实时可视化Go Runtime指标,这个Go库超赞

我是一只可爱的土拨鼠,专注于分享 Go 职场、招聘和求职,解 Gopher 之忧!欢迎关注我。欢迎大家加入Go招聘交流群,来这里找志同道合的小伙伴!跟土拨鼠们一起交流学习。前言小土之前分享过一篇如何监控 Go Runtime的文章,主要是通过Grafana,Graphite,Statsd等组件来采用UDP协议采集metrics上报到Grafana来进行一系列的展示。相对比较繁琐。今天小土带来一个G...

2022-11-20 08:20:44 185

转载 Go 十年了,终于想起要统一 log 库了!

在日常工作中,打日志是很常见的动作。毕竟不打日志,从内部来讲,一旦出问题,定位、排查都会变的非常困难。谁也不想大半夜在那靠猜解决问题。在其他方面,对日志的存储的内容、时长、安全均有不同程度的合规要求,应对客户诉求和提单上门的事件。日志好不好用,就成了重要的诉求了。标准库 log 很痛思考一个问题:平时你在写 Go 工程时,是否很少直接使用官方标准库 log?在正式项目中,大多是优先使用几个爆款第三...

2022-11-17 08:50:05 395

转载 图解 LeakyBucket限流器的实现原理

leaky bucket 也叫漏桶,就是将请求先放到一个桶中进行排队,然后按固定的速率来处理请求,即所谓的漏出。桶具有一定的容量,即最多能容纳多少个请求排队,当桶满的时候,再进来的请求就直接过滤掉,不再被处理。算法的实现有很多种,本文要介绍的算法是基于计数的原理实现的。计数原理的本质就是基于一个始终记录桶中最后一个请求被处理时间的字段、当前时间和速率来计算当前请求能够被处理的时间。如下图所示:该算...

2022-11-16 08:20:32 139

转载 kafka producer 在 aws 又挂了

之前公司因为 aws 的 kafka 服务上的副本数配置不正确,所以在 aws 例行重启时会导致 producer hang,连锁导致消费断连,当时总结了一篇简单的文章:aws 上 kafka 服务更新导致断连一例[1]然而在将队列的副本数都修正之后,发现 producer hang 从高概率必现变成了低概率必现。。这就让人头痛了。虽然我们也保留了问题的现场,把各种日志多种姿势 Google 检索...

2022-11-15 09:28:16 261

转载 Go map 竟然也会发生内存泄漏?

Go 程序运行时,有些场景下会导致进程进入某个“高点”,然后就再也下不来了。比如,多年前曹大写过的一篇文章[1]讲过,在做活动时线上涌入的大流量把 goroutine 数抬升了不少,流量恢复之后 goroutine 数也没降下来,导致 GC 的压力升高,总体的 CPU 消耗也较平时上升了 2 个点左右。有一个 issue[2] 讨论为什么 allgs(runtime 中存储所有 goroutine...

2022-11-14 08:20:36 187

转载 深度解密Go语言之sync.map

工作中,经常会碰到并发读写 map 而造成 panic 的情况,为什么在并发读写的时候,会 panic 呢?因为在并发读写的情况下,map 里的数据会被写乱,之后就是 Garbage in, garbage out,还不如直接 panic 了。本文目录如下:是什么Go 语言原生 map 并不是线程安全的,对它进行并发读写操作的时候,需要加锁。而 sync.map 则是一种并发安全的 map,在 G...

2022-11-11 08:24:38 216

转载 「Go工具箱」go语言csrf库的使用方式和实现原理

❝上帝只垂青主动的人 --- 吴军 《格局》❞大家好,我是渔夫子。本号新推出「Go工具箱」系列,意在给大家分享使用go语言编写的、实用的、好玩的工具。今天给大家推荐的是web应用安全防护方面的一个包:csrf。该包为Go web应用中常见的跨站请求伪造(CSRF)攻击提供预防功能。csrf小档案「csrf小档案」star837used by-contributors25作者Gorilla功能...

2022-11-09 09:10:26 369

转载 如何让 Go 反射变快

最近读到一篇关于 Go 反射的文章,作者通过反射给结构体填充字段值的案例,充分利用 Go 的各种内在机理,逐步探讨让代码运行得更快的姿势。文章(原文地址:https://philpearl.github.io/post/aintnecessarilyslow/)非常有学习价值,故翻译整理了下来。不要使用反射,除非你真的需要。但是当你不使用反射时,不要认为这是因为反射很慢,它也可以很快。反射允许你在...

2022-11-08 08:20:03 110

转载 Go语言爱好者周刊:第 165 期 —— 基于 fyne 实现一个简单计算器

这里记录每周值得分享的 Go 语言相关内容,周日发布。本周刊开源(GitHub:polaris1119/golangweekly[1]),欢迎投稿,推荐或自荐文章/软件/资源等,请提交 issue[2] 。鉴于一些人可能没法坚持把英文文章看完,因此,周刊中会尽可能推荐优质的中文文章。优秀的英文文章,我们的 GCTT 组织会进行翻译。题图:基于 fyne 实现一个简单计算器 https://dev....

2022-11-07 08:20:52 487

转载 惊!空 struct 地址竟然不相等

Go 语言里的空 struct{} 是一个特殊的结构,因为编译器优化的关系,会导致我们拿空 struct 指针做比较的时候出现一些意外的结果。之前有人提过相关的 issue,不过还是值得我们简单研究一番。官方 spec 中对此的描述是:"Pointers to distinct zero-size variables may or may not be equal.",来看看实现上具体为什么会是这...

2022-11-06 08:20:31 141

转载 Go channel 的妙用

昨天在内网上看到一篇讲数据库连接的文章,列出了一些 sql 包的一些源码,我注意到其中取用、归还连接的方式非常有意思——通过临时创建的 channel 来传递连接。在 sql.DB 结构体里,使用 freeConn 字段来表示当前所有的连接,也就是一个连接池。typeDBstruct{freeConn[]*driverConn}当需要拿连接的时候,从 freeConn ...

2022-11-04 09:16:30 152

转载 fasthttp 快在哪里

坊间传言 fasthttp 在某些场景下比 nginx 还要快,说明 fasthttp 中应该是做足了优化。我们来做一些相关的验证工作。先是简单的 hello server 压测。下面的结果是在 mac 上得到的,linux 下可能会有差异。fasthttp:wrk -c36 -t12 -d 5s http://127.0.0.1:8080Running 5s test @ http://127...

2022-11-03 08:49:34 214

原创 10 月思考精选

点击上方蓝色“Golang来啦”关注我哟加个“星标”,天天 15 分钟,掌握 Go 语言你好,我是小四,你情商高也可以叫我四哥。平时我会用 flomo 记录一些自己的日常思考,这篇文章是我从 10 月份记录里精挑出来的几个小片段,如果可以给你以启发,那便是有价值的。10分钟规则有一段时间感觉自己的注意力很难集中,容易分心,表现为工作时忍不住点开微信、看电子书不到几分钟就不由自主地去刷短视频…觉得这...

2022-11-02 08:21:00 120

转载 架构的腐化是必然的

架构的腐化是必然的,不以人的意志为转移。我们先从一个故事开始,从前有一个公司,这个公司有一个部门,这个部门里有两个组。两个组做的项目比较类似,都是策略类项目。其中一个组做需求基本靠堆人,业务和 PM 的所有需求,能找到人,并且让这个人在各种场景,各种模块,各种分支里加 if else 就可以搞定,代码膨胀飞快。很快没人能说得清项目内的细节,但是公司业务涉及的策略又很多,需求做不过来,所以疯狂堆人,...

2022-11-01 08:20:52 129

转载 深度解密Go语言之关于 interface 的 10 个问题

这次文章依然很长,基本上涵盖了interface 的方方面面,有例子,有源码分析,有汇编分析,前前后后写了 20 多天。洋洋洒洒,长篇大论,依然有些东西没有涉及到,比如文章里没有写到反射,当然,后面会单独写一篇关于反射的文章,这是后话。还是希望看你在看完文章后能有所收获,有任何问题或意见建议,欢迎在文章后面留言。这篇文章的架构比较简单,直接抛出 10 个问题,一一解答。1. Go 语言与鸭子类型...

2022-10-31 08:20:30 154

转载 Go常见错误集锦之函数式选项模式

本节将通过一个常见的用例来展示如何使API方便且友好地接受选项配置。我们将深入研究不同的选项,以达到最后展示一个在Go中流行的解决方案:函数式选项模式。首先,从概念上看下什么是函数式选项模式。这个概念可以拆解成两部分。一部分是函数式,另一部分是选项。所谓函数式,是从函数式编程中借鉴过来的概念,即函数和其他基础类型一样,可以将函数作为参数、返回值以及赋值给其他变量。选项就是配置参数值。所以,函数式选...

2022-10-28 08:40:29 174

转载 文末免费送书!

很多时候,当我们跟着源码去理解某种事物时,基本上可以认为是以时间顺序展开,这是编年体的逻辑。还有另一种逻辑,纪传体,它以人物为中心编排史事,使得读者更聚焦于某个人物。以一种新的视角,把所有的事情串连起来,令人大呼过瘾。今天我们试着以这样一种逻辑再看 g0。回顾一下 Go 夜读第 78 期,关于调度器源码分析的内容。我们讲过,与主线程绑定的 M 对应的 g0 的主要作用是提供一个比一般 gorout...

2022-10-27 08:10:58 169

转载 Go 创始人诠释:如何对错误进行编程?

前段时间我分享了一篇文章《10+ 条 Go 官方谚语,你知道几条?》,引发了许多小伙伴的讨论。其中有一条 “Errors are values”,大家在是 “错误是值” 还是 “错误就是价值” 中反复横跳,纠结不易。其实说这句话的 Rob Pike,他用一篇文章《Errors are values[1]》诠释了这句谚语的意思,到底是什么?又能干什么?今天煎鱼和大家一起学习,以下的 “我” 均代表 ...

2022-10-26 08:26:11 126

原创 手撸源码系列 - cache2go

点击上方蓝色“Golang来啦”关注我哟加个“星标”,天天 15 分钟,掌握 Go 语言你好,我是小四,你情商高也可以叫我四哥。碰到很多同学问我,平时疲于写各种业务代码,如何才能提高编程能力?我的办法是多阅读优秀的代码,只有见过更好的,我们才能知道如何编写好的代码、提高编程能力。就好比如果学武功,你肯定要找一个武林高手作师傅。进入今天的正题。前一篇文章,我们分析了 go-cache 库,今天再来看...

2022-10-25 08:20:09 310

转载 Go Gin框架请求自动验证和数据绑定,看完这篇就会用了

之前做项目基本上公司是用 gRPC 和 echo 这两个框架的组合,后来 Gin 框架在Go圈越来越流行,陆续我在公司接触到的项目也开始有人用 Gin 框架开发了。因为我也是偶尔开发,像Gin框架里边参数的模型验证和绑定这些没有系统去学习,都是粘贴一下其他人的代码,改成我要的参数和模型,这里说的模型就是保存请求数据的 Struct。慢慢我发现每个人写的风格都不一样,有直接一个个接收参数再赋值到模型...

2022-10-22 08:20:15 1021 1

转载 面试官:哥们Go语言互斥锁了解到什么程度了?

前言当提到并发编程、多线程编程时,都会在第一时间想到锁,锁是并发编程中的同步原语,他可以保证多线程在访问同一片内存时不会出现竞争来保证并发安全;在Go语言中更推崇由channel通过通信的方式实现共享内存,这个设计点与许多主流编程语言不一致,但是Go语言也在sync包中提供了互斥锁、读写锁,毕竟channel也不能满足所有场景,互斥锁、读写锁的使用与我们是分不开的,所以接下来我会分两篇来分享互斥锁...

2022-10-20 09:05:27 137

转载 Go 程序太大了,能要个延迟初始化不?

在公司的不断发展中,一开始大多是大单体,改造慢了,一个仓库会有使用十几年的情况,仓库的规模基本是不断增大的过程。影响之一就是会应用程序打包后的体积越来越大,不知道被用哪里去了...今天要探讨的提案《proposal: language: lazy init imports to possibly import without side effects[1]》,就与此有关。提案背景我们来观察一段很简...

2022-10-19 08:20:23 68

原创 手撸源码系列 - go-cache

点击上方蓝色“Golang来啦”关注我哟加个“星标”,天天 15 分钟,掌握 Go 语言你好,我是小四,你情商高,也可以叫我四哥。什么是 go-cachego-cache 是一个轻量级的基于内存的 K-V 储存组件,内部实现了一个线程安全的 map[string]interface{},适用于单机应用。具备如下功能:线程安全,多 goroutine 并发安全访问;每个 item 可以设置过期时间(...

2022-10-17 08:20:37 356

转载 我认为 Go 的成功归功于这 5 个方面

在国外的播客节目 Go Time #100 中,Rob Pike 和 Robert Griesemer(Go 的两位创始人)和主持人 Jerod Santo 讨论了 Go 语言的成功缘由和一些思考。如果你想创造一门成功的编程语言,向已经做到的人学习是非常有价值的。欢迎对 Go 感兴趣的小伙伴一起围观!0. 说明Rob Pike(下称:Rob)将 Go 的成功归为了 5 个方面,在主持人 @Jero...

2022-10-13 08:20:28 77

转载 提升 Go 编码效率,拒绝加班,真香

在 Go 语言中,slice、map都是我们常用的基础类型,通过它们,我们可以很容易的使用数据。但是你有没有发现,为了对这两种数据进行处理,你不得不编写很多工具函数?比如,从slice切片中查找一个元素的位置?这种查找又分为从前查找、从后查找。又比如,获取map的所有keys?或者所有的value?再比如,JS语言数组的map、reduce、filter函数,这在编程中非常好用,但是遗憾的是Go标...

2022-10-12 08:20:13 129

转载 「Go工具箱」一个将非负整数转换成唯一、无序ID的工具:hashids

今天给大家推荐的工具是hashids。该工具可以将一个正整数转换成长度较短、唯一且不连续的ID值。一般适用于生成用户ID,但又不想用有规律的ID的场景。原理分析:将长字符串转换成短字符串的本质是进制转换。将小进制数往大进制数上转换就会变短,将大进制数往小进制数上转换就会变长。比如将一个二进制数转换成十进制就可以将二进制数变短。如下将1010转换成十进制就是 10,转换成十六进制就是a。该hashi...

2022-10-10 12:00:51 340 1

转载 「Go工具箱」一个简单、易用、安全的类型转换工具

在使用Go编码过程中,大家一定遇到过类型转换的场景。今天就给大家介绍一个简单、易用且安全的类型转换工具:cast。以下是cast的基本档案:cast包档案star2.5kused by74.1kcontributors26工具分类效率功能简介在不同类型之间进行简单、安全的类型转换应用场景:该包当初是专门为著名的web框架Hugo开发的。一般应用在将接口类型转换到一个具体的类型时,以及从YAML、J...

2022-09-30 08:20:32 187

转载 Go 的零值有什么用?看看这 4 个场景

前文给大家分享了《10+ 条 Go 官方谚语,你知道几条?》,今天进一步讲讲第 5 条谚语 Make the zero value useful(让零值变得有用),看看里面讲的是什么意思。背景Go 语言中有一个有些特殊的概念,叫做零值。许多转语言的同学经常会弄混淆,一开始会不适应。代码如下:funcmain(){variintvarffloat64varbboolv...

2022-09-29 08:35:58 116

转载 在 Go 里用 CGO?这 7 个问题你要关注!

今天给大家分享的是 Go 谚语中的 Cgo is not Go[1],原文章同名,略有修改,原文作者是 @Dave Cheney。以下的 “我” 均指代原作者。借用 JWZ 的一句话:有些人在面对一个问题时,认为 "我知道,我会使用 cgo(来解决这个问题)"。类似的引言在使用 cgo 后,他们就会遇到两个新问题。Cgo 是什么Cgo 是一项了不起的技术,它允许 Go 程序与 C 语言库相互操作,...

2022-09-28 08:20:08 296

转载 Go语言实战稀疏文件解压,4倍提升,多个技巧!!

前段时间,使用Golang写了个解压tar文件的小工具,速度比linux自带的tar要快很多(4、5倍差距),而且同样支持稀疏文件,具体关于稀疏文件的解释,可以参考我这篇文章Golang 和稀疏文件。前方高能,稍微有点枯燥,但能学到东西:tar标准包不支持稀疏文件,自己如何支持如何调用私有方法如何提升解压性能golang tar解压首先呢,我通过一个简单的tar文件解压的例子,逐步的分析它的实现...

2022-09-27 12:40:50 269

转载 Go语言三个高效编程的技巧

Go是一种非常不错的编程语言。它是一种让你真正的关注自己的业务,不必为程序本身操心太多的语言,因此您可以尽快编写应用程序。比如它有比较完整的生态系统,可为你提供入门所需的一切。但是呢,它也不是万能的,有一些需要我们注意。我写这篇文章主要是为了提醒我自己,也是一些观察和总结。当然,这些只是技巧,并不是真正的问题,当然如果你注意到它们并且在实战中使用,那么将会让你非常受益,这是新手和老手的差别。不要使...

2022-09-25 08:20:31 99

转载 Golang连接池的几种实现案例

因为TCP的三次握手等等原因,建立一个连接是一件成本比较高的行为。所以在一个需要多次与特定实体交互的程序中,就需要维持一个连接池,里面有可以复用的连接可供重复使用。而维持一个连接池,最基本的要求就是要做到:thread safe(线程安全),尤其是在Golang这种特性是goroutine的语言中。实现简单的连接池type Pool struct { m sync.Mutex //保证多个...

2022-09-23 08:20:45 1251

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除