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{} 也可以:(这里

Go1.18 快讯:新的 IP 包

大家好,我是 polarisxu。 Go 1.18 标准库新增了一个包:net/netip,大部分人可能用不上这个包,但这个包的设计思路以及和现有标准库 IP 的比较值得学习。 01 标准库 net.IP 的问题 前 Go Team 成员之一 Brad Fitzpatrick 加入 Tailscale 后,经常需要操作 IP 地址。因为使用 Go 语言实现的,自然会使用过标准库的 net.IP 和 net.IPNet 等类型。但他们认为标准库的相关类型有很多问题,所以他们自己写了一个包:https://gith

Go编程模式:详解函数式选项模式

大家好,我是 polarisxu。 Go 不是完全面向对象语言,有一些面向对象模式不太适合它。但经过这些年的发展,Go 有自己的一些模式。今天介绍一个常见的模式:函数式选项模式(Functional Options Pattern)。 01 什么是函数式选项模式 Go 语言没有构造函数,一般通过定义 New 函数来充当构造函数。然而,如果结构有较多字段,要初始化这些字段,有很多种方式,但有一种方式认为是

Go泛型系列:slices 包讲解

大家好,我是 polarisxu。 前段时间,Russ Cox 明确了泛型相关的事情 ,原计划在标准库中加入泛型相关的包,改放到 golang.org/x/exp 下。 目前,Go 泛型的主要设计者 ianlancetaylor 完成了 slices 和 maps 包的开发,代码提交到了 golang.org/x/exp 中,如果经过使用、讨论等,社区认可后,预计在 1.19 中会合入标准库中。 今天,通过学习 slices 包,掌握 Go 泛型的使用方法。 01 为什么增加 slices 包 标准库有 bytes 和 strings 包,分别用来处理 []byte 和 string 类型,提供了众多方

Nginx 竟然也有 playground — Go 语言构建的

大家好,我是 polarisxu。 曾几何时,playground 似乎成了新语言的标配:Go 发布就带有 https://play.golang.org/ ,Rust 发布也有 https://play.rust-lang.org/ 。你想过 Nginx 也有一个 playground 吗?你可以通过它方便的测试 Nginx 配置。 今天发现,还真有一个,地址:https://nginx-playground.wizardzines.com 。关键是,后端使用 Go 构建的。 以下是该网址的截图: 本文简单介绍下这个 playgr