开发者工具 · Go 全栈

Go 标准库速查

标准库包/函数/示例索引

✓本地处理 · 不上传 ✓免费 · 无需登录 ✓无次数限制 累计 108 次使用

Go 标准库速查

fmt / strings / time / net/http / strconv 等 · 点击复制

第一节

关于本工具

About

Go 开发者翻文档时,最烦的是在标准库页面间来回跳转找函数签名和示例。这个速查工具把每个包的常用函数、参数说明、返回值类型和一段可运行的示例代码直接摊开在同一个页面里,省去切标签页的功夫。所有数据都打包在浏览器端,打开即用,不向任何服务器发送请求。适合在写 import 语句前确认签名、或想快速看某个函数怎么拼写时使用。

使用场景

壹

重构遗留代码

接手一个五年未动的 Go 项目,代码里散落着大量 `ioutil.ReadAll` 和 `os.IsNotExist`。新版本 Go 已废弃这些函数,但团队没人记得替换方案。打开本工具,输入旧函数名,一秒定位到对应的新 API 和迁移示例,十处调用半小时改完,编译零警告。

贰

面试前突击查

下午两点面试,候选人在简历里写了“熟悉 Go 并发模型”。面试官趁午休打开本工具,快速过一遍 `sync.Mutex`、`sync.WaitGroup`、`context.WithTimeout` 的签名与典型用法,面试时能精准追问细节,不再凭记忆模糊判断。

叁

写 CI 脚本查 API

凌晨一点,线上 CI 告警说构建失败。排查发现是 `go test -race` 与 `os.Signal` 的交互有竞态。运维在手机浏览器打开本工具,查 `os/signal` 包的正确用法和 `signal.NotifyContext` 的示例,改了三行代码,CI 绿回。

肆

跨语言转写函数

Python 后端转 Go,一个 `time.strptime` 的日期解析逻辑需要重写。打开本工具搜 `time.Parse`,看到 layout 格式必须用 `2006-01-02` 这种魔性参考时间,对照示例秒懂,不用翻官方文档的冗长表格。

伍

排查包版本冲突

go.mod 里 `golang.org/x/net` 被间接依赖拉了两个大版本,编译报错。用本工具查 `net/http` 包在 Go 1.20 和 1.22 之间的签名差异,发现 `ResponseController` 是 1.20 新增的,直接改 import 路径解决冲突,省去逐行 diff 源码的半小时。

第二节

使用指南

Getting Started

使用步骤

  1. 1在搜索框输入包名或函数名(如 `http.HandleFunc`),下方即时列出匹配项与所属包路径
  2. 2点击任一结果行,展开该函数/类型的签名、参数说明与返回值类型
  3. 3在展开详情中点击「示例」标签页,直接查看可运行的 Go 代码片段及输出注释
  4. 4点击代码块右上角「复制」图标,将示例代码复制到剪贴板,供本地 IDE 粘贴测试

输入输出示例

输入输出说明
strings.HasPrefixfunc HasPrefix(s, prefix string) bool常规:最常用字符串函数之一,验证包名+函数名索引准确
net/httppackage net/http // import "net/http" Package http provides HTTP client and server implementations. func Get(url string) (resp *Response, err error) func Handle(pattern string, handler Handler) func ListenAndServe(addr string, handler Handler) error ...常规:标准库最热门包,验证包文档+关键函数列表完整
os.OpenFilefunc OpenFile(name string, flag int, perm FileMode) (*File, error)常规:带多个参数的典型系统调用,验证参数签名展示完整
io.ReadFullfunc ReadFull(r Reader, buf []byte) (n int, err error)边界:io 包中不直接暴露的辅助函数,验证索引覆盖深度
unsafepackage unsafe // import "unsafe" Package unsafe contains operations that step around the type safety of Go programs. func Alignof(x ArbitraryType) uintptr func Offsetof(x ArbitraryType) uintptr func Sizeof(x ArbitraryType) uintptr type ArbitraryType int type Pointer *ArbitraryType边界:特殊包(unsafe),验证特殊类型和函数展示正确
math.MaxFloat64const MaxFloat64 = 1.7976931348623157e+308边界:常量查询,验证常量值精确到科学计数法
time.Parse("2006-01-02", "2024-01-01")func Parse(layout, value string) (Time, error)易错:用户常误以为输入完整调用示例,实际工具只返回函数签名,不执行代码
errors.Newfunc New(text string) error易错:最简函数(仅一个参数),验证无歧义展示

常见错误对照

1.包名与路径混淆,导入语句写错

✗ 错误import "fmt"
✓ 修复import "fmt"

标准库包名就是导入路径的最后一段,但第三方包路径不同,例如 import "github.com/gin-gonic/gin" 中包名是 gin,不是整个路径。初学者常把整个 URL 当包名用。

2.函数名大小写搞错,无法导出

✗ 错误fmt.println("hello")
✓ 修复fmt.Println("hello")

Go 中首字母大写的标识符才能被包外访问。fmt.println 是小写,属于包内私有,编译报错 undefined。

3.错误处理用 panic 代替返回 error

✗ 错误if err != nil { panic(err) }
✓ 修复if err != nil { return err }

panic 会终止当前 goroutine 并触发堆栈展开,仅用于不可恢复的异常(如数组越界)。正常业务错误应通过 error 返回值传播。

4.切片 append 后忘记重新赋值

✗ 错误s := []int{1,2,3} append(s, 4) fmt.Println(s) // 输出 [1 2 3]
✓ 修复s := []int{1,2,3} s = append(s, 4) fmt.Println(s) // 输出 [1 2 3 4]

append 返回新切片,不会修改原切片。如果底层数组容量足够,原切片长度不变,必须用返回值覆盖原变量。

5.map 读取未初始化变量,编译通过但运行时 panic

✗ 错误var m map[string]int m["key"] = 1
✓ 修复m := make(map[string]int) m["key"] = 1

nil map 可以读取(返回零值),但写入会 panic。必须用 make 或字面量初始化后才能赋值。

6.defer 中捕获函数返回值,但 defer 在 return 后执行

✗ 错误func f() (err error) { defer func() { err = nil }() return errors.New("oops") }
✓ 修复func f() (err error) { defer func() { err = nil }() return errors.New("oops") }

这个例子其实正确——defer 可以修改命名返回值。但常见误区是认为 defer 在 return 之前执行,实际顺序是:先赋值给返回值,再执行 defer,最后返回。

7.for range 循环中取变量地址,全指向同一个变量

✗ 错误for _, v := range slice { go func() { fmt.Println(&v) }() }
✓ 修复for _, v := range slice { v := v go func() { fmt.Println(&v) }() }

for range 中 v 是循环变量,每次迭代复用同一地址。goroutine 闭包捕获的是 v 的引用,最终所有 goroutine 都看到最后一个元素。Go 1.22 后已修复,但旧版本需手动复制。

8.接口断言用错类型,导致 panic

✗ 错误var i interface{} = "hello" s := i.(int) // panic
✓ 修复var i interface{} = "hello" s, ok := i.(int) if !ok { /* 处理类型不匹配 */ }

直接断言(i.(T))若类型不匹配会 panic。使用逗号 ok 模式(i.(T))可安全判断,ok 为 false 时 s 为零值。

第三节

工作原理

How It Works

核心公式

len(s) = 字符串 s 的字节数

变量说明

  • sGo 字符串,UTF-8 编码
  • len(s)返回字节数,非字符数

示例

字符串 s = "Hello, 世界"(5 个 ASCII 字节 + 3 个中文字符各 3 字节 = 5 + 9 = 14 字节):len(s) = 14。若按字符数(rune 数)则为 9。

输入包名/函数本地索引查表(纯前端 JSON)匹配签名/示例(模糊匹配)展示结果浏览包列表按分类筛选(I/O/网络/文本)展开包内函数(含代码示例)展示结果
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
问我搜 io.Copy 怎么没找到?+
答

搜不到可能是因为包名没写全。本工具按「包名.函数名」索引,比如 io 包下的 Copy 函数需要搜 io.Copy,单独搜 Copy 不会命中。另外注意大小写——Go 标准库函数首字母大写(Copy 不是 copy)。如果还是搜不到,检查一下是不是第三方库(比如 gin、cobra),本工具只收录 Go 官方标准库。

问搜索结果里为什么有些函数点进去只有签名没有示例?+
答

部分函数(尤其是内部方法或较冷门函数)在官方文档中本身就没有示例代码。本工具直接引用 Go 官方标准库文档数据,不会自己补写示例。如果该函数在 pkg.go.dev 上也没有 Example,那本工具对应的页面同样不会展示。建议结合官方文档的测试文件(*_test.go)看实际用法。

问这个工具和 pkg.go.dev 有什么区别?+
答

pkg.go.dev 是 Go 官方文档站,内容最全但页面加载慢,搜索需要网络请求。本工具是纯前端实现(WASM),所有索引数据打包在浏览器本地,打开后完全离线可用,搜索响应是毫秒级的。缺点是只收录标准库(不包括第三方包),且数据更新会滞后于官方发布的新版本。

问为什么搜 time.Now 出来的结果里没有返回值的说明?+
答

本工具侧重「速查」—— 函数签名、参数类型、返回值类型、简短描述和代码示例。返回值详细说明(比如 time.Now 返回的 Time 结构体包含哪些字段)不在当前展示范围内,因为那是文档页而不是速查页的职责。如果需要完整的字段文档,可以点击结果页底部的「查看官方文档」链接跳转到 pkg.go.dev。

问我离线状态能用吗?+
答

能。本工具是纯前端实现,所有数据(包列表、函数签名、示例代码)都预加载在浏览器本地。首次访问时会下载一个约 2MB 的索引文件,下载完成后即使断网也能正常搜索。但如果要跳转到官方文档链接,那一步需要网络。

问搜 net/http 出来一堆函数,怎么快速找到我要的?+
答

搜索结果默认按字母排序,不区分包。如果包内函数很多(比如 net/http 有上百个),建议在搜索框里输入「包名.函数名」缩小范围,例如 net/http.HandleFunc。另外结果列表的每一项前面会标注包名(灰色小字),扫一眼包名可以快速排除不相关的函数。

问为什么有的函数名后面带个 # 号?+
答

带 # 号的表示该函数是某个类型的方法(Method),而不是包级函数。例如 time.Time.Format 中的 Format 是 Time 类型的方法。点击后页面会展示该方法的接收者类型、签名和示例。如果你只想看包级函数,搜索时加前缀 pkg. 即可,比如 time. 会只显示 time 包的顶层函数。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

↑↓选择 ↵打开 ⌘+↵新窗口 esc关闭