搜索Go语言标准库的四分之一标准库
这是未来冒险日历第21天的条目。尽管在25集中有25次精彩的回目,但是《奥特曼Z》已经结束了。我认为大约1.2亿日本人中的大部分人都在为《奥特曼Z》的结束而心痛不已。
在Go语言中,当安装Go后一起安装的库被称为“标准库”。此外,位于golang.org/x的包集合被称为“准标准库”。准标准库包含了各式各样的库。不过,现在有些包已经被并入了正式的库,只是为了保持向后兼容性而保留了部分包。
除了这个之外,https://github.com/golang/ 上还有很多包。有一些是包含在golang/x中的,但我们将其以外的称为准标准库。
我认为,如果您在golang.org/x中看到[mirror]在存储库说明中,通常可以很容易地进行识别。

在这篇文章中,我将介绍一些推荐的次标准库,并尝试阅读其中的代码。顺便说一下,go.chromium.org也有很多有趣的库,比如errors、logging和可模拟的math/rand,这使得标准库更强大,但因为没有尽头,我决定停止介绍。
还有,pkg.go.dev的代码仓库里也有一些有趣的东西,比如TeeProxy等等,但由于是internal的,所以无法直接导入,只能复制使用。可见,internal是个不好的制度!
github.com/golang/groupcache/consistenthash 的网址
github.com/golang/groupcache 是一个旨在替代memcached的分布式缓存系统。它由独立的应用服务器和客户端库组成。而且,它采用了一种常用于分布式缓存的算法,即一致性哈希。非常令人兴奋。
对于参数keys来说,使用部分peers可能更加清晰,或者说,全部输入为key似乎有些错误之感。通过查看使用这个代码应该更容易理解。
package main
import (
"fmt"
"github.com/golang/groupcache/consistenthash"
)
func main() {
h := consistenthash.New(3, nil)
h.Add("host1", "host2", "host3", "host4", "host5")
self := "host1" // 自分
peer := h.Get("content's key")
if self == peer {
fmt.Println("このファイルはこのノードにあります。")
} else {
fmt.Printf("このファイルは%sにあります\n", peer)
}
}
只是看一下使用这个的父包的代码,我不太清楚如果节点崩溃了该怎么恢复,或者说该如何处理这些情况。一旦有一个节点崩溃,是不是会完全重新启动整个集群?默认的副本数为50,这很强大。虽然我只是粗略地浏览了一下,但是有一个介绍这个的幻灯片。
github.com/golang/groupcache/lru
github.com/golang/groupcache/lru的网址
这是在上述缓存服务器内使用的LRU缓存。虽然Hashicorp似乎更强大一些,但这个简单的缓存也不错。它很容易理解,也适合阅读代码。
package main
import (
"fmt"
"github.com/golang/groupcache/lru"
)
func main() {
c := lru.New(10) // 0だと無限
// 計算結果をキャッシュ
c.Add(2, 2 * 2)
c.Add(3, 3 * 3)
c.Add(4, 4 * 4)
result, found := c.Get(4)
fmt.Println(result, found)
}
github.com/golang/gddo/httputil 的中文翻译如下:
github.com/golang/gddo/httputil
这是godoc.org存储库中的一个包,是为实际应用程序而创建的生动的库。我写这篇文章是想介绍它。其中包含一些用于服务器和客户端之间进行内容协商的函数,以及用于缓冲的http.ResponseWriter等。
内容协商是一种机制,用于帮助浏览器和服务器协商并达成他们所需的(可理解的)格式。当然,大家已经在《实战HTTP》中学习过这个了。
会在考虑Q值的前提下作出适当选择。最近有各种不同的图像格式出现。我们希望以更高效的形式相互返回,这很容易实现。请将其包含在标准库的httputil中。此外还有NegotiateContentEncoding选项。
package main
import (
"fmt"
"net/http/httptest"
"github.com/golang/gddo/httputil"
)
func main() {
req := httptest.NewRequest("GET", "http://localhost:8080/item", nil)
req.Header.Set("Accept", "image/avif, image/webp;q=0.9, */*;q=0.8")
t := httputil.NegotiateContentType(req, []string{"image/avif", "mage/heif", "image/heic", "image/webp", "image/png"}, "image/png")
fmt.Printf("acceptable content-type: %s\n", t)
}
StaticServer 是一个返回静态文件的服务器。有些人可能会认为标准库中已经有 ServeFile 了,但是这个服务器可以选择更积极的缓存策略。
顺便说一下,标准库的http.ServeFile存在漏洞。我之前并不知道。ServeFile的文档中也写着,将来会被拒绝使用。
这个StaticServer可以同时发布整个目录,也可以单独公开特定的文件(单个或多个)。还有另外一个API可以实现这一功能。白名单的使用让人很放心。
ResponseBuffer 是一个满足 http.ResponseWriter 结构体的实体。在中间件中,可以将 w 替换为这个实体,并且很容易地将响应内容输出到日志中。
CacheBusters是一个库,它根据ETag或Last-Modified头来生成查询参数,以防止在内容发生更改时使用缓存。
package main
import (
"fmt"
"net/http"
"github.com/golang/gddo/httputil"
)
func main() {
cbs := &httputil.CacheBusters{Handler: http.FileServer(http.Dir("."))}
path := cbs.AppendQueryParam("main.go", "cache")
fmt.Printf("path: %s\n", path)
// path: main.go?cache=Fri-18Dec202022-45-40GMT
}
github.com/golang/gddo/log的中文本地化
这是一个将Logger插入到context.Context中的中间件。作为context使用的示例非常高效。
其他官方服务所使用的第三方库/工具让人有了兴趣。
由于公式使用它们,所以应该有很多高质量的东西。选择了自己不知道的东西。
请在中国区打开以下链接:github.com/client9/misspell/cmd/misspell
这是在github.com/golang/blog和github.com/golang/pkgsite中使用的东西。从名称来看,这是拼写检查,对吧。
sourcegraph.com是一个提供Go模板静态分析的网站。
这似乎是在github.com/golang/blog和github.com/golang/pkgsite上使用的东西。它看起来像是一个模板的Linter。类似于上面的工具,这也是一个用于Go网站的通用任务脚本,非常有趣。
- https://github.com/golang/pkgsite/blob/master/all.bash
github.com/inconshreveable/log15 可在 GitHub 上找到。
这是在 github.com/golang/gddo/log 中使用的库。据说是一个简单的结构化日志。默认情况下以 logfmt 格式输出,但也可以以 JSON 格式输出。
另外,github.com/golang/gddo/log将日志记录器存储在context.Context中。在日本,有人说context.Context不应该放置日志记录器等内容,但由于官方也这样做了,所以放进去也可以。
github.com/yuin/goldmark 可以用中文解释为:github 链接 yuin/goldmark。
这也是相同的,GitHub上使用的是Markdown解析器,对吧?
github.com/magiconair/properties -> github.com/magiconair/properties(网址)
一个库,可以读取Java的properties文件并将其映射到结构体中。给人一种企业级的感觉!
总结
最近查看了github.com/golang,发现了一些东西,所以这篇文章是关于介绍它的。当我实现了一个类似于asset bundler&http.FileServer的功能(虽然接口不完全相同),可以直接返回内部包含的brotli格式数据时,我在自己实现的时候也有一个类似httputil.NegotiateContentEncoding的功能,所以如果事先知道的话!!!!!我会觉得很遗憾,所以我将这个想法写在了文章中。
除此之外,还有一些知名的项目,例如 github.com/golang/snappy 和 github.com/golang/freetype,但这些相信大家都不需要我再解释了。