终于有 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.wizar

Go泛型系列:Go1.18 类型约束那些事

大家好,我是 polarisxu。 上篇《Go泛型系列:提前掌握Go泛型的基本使用》 简单讲解了泛型中的约束,但约束相关内容远不止那些,本文介绍更多约束相关内容。 请安装最新的 tip 版本,方便验证本文的内容。当然,也可以通过 https://gotipplay.golang.org/ 在线验证。 01 语法变更 上次提到,定义约束的语法类似这样: type Addable interface { type int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, uintptr, float32, float64, complex64, complex128, string } 不过目前已经确认,语法改成如下形式: type Addable interface { int |

Go1.18 快讯:Module 工作区模式

大家好,我是 polarisxu。 工作区模式(Workspace mode),可不是之前 GOPATH 时代的 Workspace,而是希望在本地开发时支持多 Module。 01 缘起 为了大家全面理解工作区模式,通过一个具体例子讲解。 本地有两个项目,分别是两个 module:mypkg 和 example。(Windows 系统请按自己方式创建目录) $ cd ~/ $ mkdir polarisxu $ cd polarisxu $ mkdir mypkg example $ cd mypkg $ go mod init github.com/polaris1119/mypkg

Go1.18 快讯:新增的 Cut 函数太方便了

大家好,我是 polarisxu。 在编程中,字符串使用是最频繁的。Go 语言对字符串相关的操作也提供了大量的 API,一方面,字符串可以向普通 slice 一样进行相关操作;另一方面,标准库专门提供了一个包 strings 进行字符串的操作。 01 strings.Index 系列函数 假如有一个这样的需求:从 192.168.1.1:8080 中获取 ip 和 port。 我们一般会这么实现: addr := "192.168.1.1:8080" pos := strings.Index(addr, ":") if pos == -1 { panic("非法地址") } ip, port :=