为 Java 开发者准备的 Go 教程 01:漫游了

大家好,我是 polarisxu。 在正式工作之前,一直使用 Java,虽然这些年对 Java 的关注变少了,但很显然,Java 用户群体特别大。不过,我也知晓,有不少 Java 用户在学 Go。我尝试写一系列文章,为 Java 开发者讲解 Go 语言。 这是第一篇,从大的层面简单对比下 Go 和 Java,算作是一次漫游。 整体上,Java 和 Go 之间有许多明显而微妙的区别,包括语言层面和运行时层面。我们这里主要在语

我的 2021 年终总结

大家好,我是 polarisxu。 元旦假期结束,2022 年工作开启,2021 年总结做了吗?今天我简单回顾下我的 2021。 年终总结,是对我自己的一个回顾,但发出来,我希望能够对大家有点帮助或启发。 这份总结主要会聊五个方面的内容: 写作 读书 理财 家庭 收获 01 写作 这里主要谈我的个人品牌公众号 「polarisxu」,而不是 「Go语言中文网」,Go语言中文网的年终总结见:Go

泛型版 singleflight:Go 中如何防止缓存击穿?

大家好,我是 polarisxu。 并发是 Go 的优势,但并发也需要很好的进行控制。标准库中有 sync 包,经常使用的功能有 sync.Mutex、sync.WaitGroup 等。其实,除了标准库,还有一个官方的扩展库,也叫 sync,其中有一个子包:sync/singleflight,专门做并发控制,比如防止缓存击穿。 01 从例子说起 看一个模拟缓存的例子,有如下代码: package main import ( "errors" "flag"

2021 年你写了多少代码?这个 Go 工具帮你统计

大家好,我是 polarisxu。 2021 年马上要过完了,一年下来,你写了多少代码?其中 Go 代码又有多少呢?虽然大家一般讨厌将代码行数作为考核业绩指标,但我们自己对一年的代码量有一个基本掌握还是挺有必要的。 如果你搜索,会发现代码统计工具有很多。比如 sloccount 、github.com/AlDanial/cloc 等,似乎大家很喜欢统计代码行数。当然,也有人直接使用 grep、awk 之

Go1.18 新特性:TryLock

大家好,我是 polarisxu。 我们知晓,Go 标准库的 sync/Mutex、RWMutex 实现了 sync/Locker 接口, 提供了 Lock() 和 UnLock() 方法,可以获取锁和释放锁,我们可以方便的使用它来控制对共享资源的并发控制。(其他语言,比如 Java 是有类似 TryLock 的功能的) type Locker interface { Lock() Unlock() } 但是锁被获取后,在未释放之前其他 goroutine 再调用 Lock 则会被阻塞住,这种设计在有些情况下可能不能满足需求。有时我们希望尝试获取锁,

Go 泛型入门教程

大家好,我是 polarisxu。 有泛型的 Go 版本 1.18 已经发布了 Beta1 版本,之前陆陆续续介绍了泛型,但可能有些人还是对 Go 泛型没有完整的了解,因此有这份入门教程。 01 准备工作 开始学习泛型之前,你应该安装 Go1.18 Beta1 或之后发布的版本,建议使用 goup 等版本管理工具 ,当然也可以直接通过 playground 来验证:https://go.dev/play/?v=gotip。 不过,本教程基于本地安装 Go1.18 Beta1 为例进行。

程序员瑞士军刀:各种结构的转换工具

大家好,我是 polarisxu。 上次推荐的 「Go网址导航」,其中收录了一项:转换器。 网址是:https://transform.tools/。 这是一个开源项目,项目地址:https://github.com/ritz078/transform,目前 Star 数 2.8k+。 这个网站将转换工具分成了几类: SVG HTML JSON JSON Schema CSS JavaScript GraphQL JSON-LD TypeScript Flow Others 其中有一些对 Gopher 比较有用,这里简单列举介绍下

终于有 Go 版的 Elasticsearch 了

大家好,我是 polarisxu。 企业内部搭建搜索引擎常用 Solr、Elasticsearch,它们都是使用 Java 实现的,底层依赖 Lucene,Java 相对来说占用较多内存。而今天要介绍的这个项目,目标就是作为 ES 的替代者,一个轻量级搜索引擎:Zinc。 项目地址:https://github.com/prabhatsharma/zinc,该项目开源十来天,目前 Star 数 3

Go泛型系列:maps 包讲解

大家好,我是 polarisxu。 之前文章介绍了 slices 包 ,本文介绍另一个包,用于 map 相关操作,目前同样放在 golang.org/x/exp 包下。 https://github.com/golang/exp/blob/master/maps/maps.go 01 真实的场景 不少新手,对 map 的输出是随机的有迷惑,曾经,map 的输出顺序是固定的,但官方怕大家依赖这个顺序,之后故意让输出顺序不固定。 但实际场景中,会有按某种顺序输出 map 的需求,怎么办呢?这需要对 map 的 key 进行排序,伪代码如下: for k := m { keys = append(keys, k) } sort(keys) 类似的代码

Go 1.18 中的 any 是什么?

大家好,我是 polarisxu。 Go 1.18 因为泛型引入 any,这实际上是 interface{} 的别名: type any = interface{} 以下代码虽然不是泛型,但用 Go 1.18 可以正常运行,证明 any 和 interface{} 是一样的:(这里可以在线运行:https://gotipplay.golang.org/p/dPeNhe-7nkA) package main import ( "fmt" ) // 这里的 any 并非泛型的约束,而是类型 func test(x any) any { return x } func main() { fmt.Println(test("a")) } 泛型中,any 换为 interface{} 也可以:(这里