Go 标准库速查
fmt / strings / time / net/http / strconv 等 · 点击复制
fmt / strings / time / net/http / strconv 等 · 点击复制
Go 开发者翻文档时,最烦的是在标准库页面间来回跳转找函数签名和示例。这个速查工具把每个包的常用函数、参数说明、返回值类型和一段可运行的示例代码直接摊开在同一个页面里,省去切标签页的功夫。所有数据都打包在浏览器端,打开即用,不向任何服务器发送请求。适合在写 import 语句前确认签名、或想快速看某个函数怎么拼写时使用。
接手一个五年未动的 Go 项目,代码里散落着大量 `ioutil.ReadAll` 和 `os.IsNotExist`。新版本 Go 已废弃这些函数,但团队没人记得替换方案。打开本工具,输入旧函数名,一秒定位到对应的新 API 和迁移示例,十处调用半小时改完,编译零警告。
下午两点面试,候选人在简历里写了“熟悉 Go 并发模型”。面试官趁午休打开本工具,快速过一遍 `sync.Mutex`、`sync.WaitGroup`、`context.WithTimeout` 的签名与典型用法,面试时能精准追问细节,不再凭记忆模糊判断。
凌晨一点,线上 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 源码的半小时。
| 输入 | 输出 | 说明 |
|---|---|---|
| strings.HasPrefix | func HasPrefix(s, prefix string) bool | 常规:最常用字符串函数之一,验证包名+函数名索引准确 |
| net/http | package 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.OpenFile | func OpenFile(name string, flag int, perm FileMode) (*File, error) | 常规:带多个参数的典型系统调用,验证参数签名展示完整 |
| io.ReadFull | func ReadFull(r Reader, buf []byte) (n int, err error) | 边界:io 包中不直接暴露的辅助函数,验证索引覆盖深度 |
| unsafe | package 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.MaxFloat64 | const MaxFloat64 = 1.7976931348623157e+308 | 边界:常量查询,验证常量值精确到科学计数法 |
| time.Parse("2006-01-02", "2024-01-01") | func Parse(layout, value string) (Time, error) | 易错:用户常误以为输入完整调用示例,实际工具只返回函数签名,不执行代码 |
| errors.New | func 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"] = 1m := make(map[string]int)
m["key"] = 1nil 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) // panicvar i interface{} = "hello"
s, ok := i.(int)
if !ok { /* 处理类型不匹配 */ }直接断言(i.(T))若类型不匹配会 panic。使用逗号 ok 模式(i.(T))可安全判断,ok 为 false 时 s 为零值。
len(s) = 字符串 s 的字节数
sGo 字符串,UTF-8 编码len(s)返回字节数,非字符数字符串 s = "Hello, 世界"(5 个 ASCII 字节 + 3 个中文字符各 3 字节 = 5 + 9 = 14 字节):len(s) = 14。若按字符数(rune 数)则为 9。
搜不到可能是因为包名没写全。本工具按「包名.函数名」索引,比如 io 包下的 Copy 函数需要搜 io.Copy,单独搜 Copy 不会命中。另外注意大小写——Go 标准库函数首字母大写(Copy 不是 copy)。如果还是搜不到,检查一下是不是第三方库(比如 gin、cobra),本工具只收录 Go 官方标准库。
部分函数(尤其是内部方法或较冷门函数)在官方文档中本身就没有示例代码。本工具直接引用 Go 官方标准库文档数据,不会自己补写示例。如果该函数在 pkg.go.dev 上也没有 Example,那本工具对应的页面同样不会展示。建议结合官方文档的测试文件(*_test.go)看实际用法。
pkg.go.dev 是 Go 官方文档站,内容最全但页面加载慢,搜索需要网络请求。本工具是纯前端实现(WASM),所有索引数据打包在浏览器本地,打开后完全离线可用,搜索响应是毫秒级的。缺点是只收录标准库(不包括第三方包),且数据更新会滞后于官方发布的新版本。
本工具侧重「速查」—— 函数签名、参数类型、返回值类型、简短描述和代码示例。返回值详细说明(比如 time.Now 返回的 Time 结构体包含哪些字段)不在当前展示范围内,因为那是文档页而不是速查页的职责。如果需要完整的字段文档,可以点击结果页底部的「查看官方文档」链接跳转到 pkg.go.dev。
能。本工具是纯前端实现,所有数据(包列表、函数签名、示例代码)都预加载在浏览器本地。首次访问时会下载一个约 2MB 的索引文件,下载完成后即使断网也能正常搜索。但如果要跳转到官方文档链接,那一步需要网络。
搜索结果默认按字母排序,不区分包。如果包内函数很多(比如 net/http 有上百个),建议在搜索框里输入「包名.函数名」缩小范围,例如 net/http.HandleFunc。另外结果列表的每一项前面会标注包名(灰色小字),扫一眼包名可以快速排除不相关的函数。
带 # 号的表示该函数是某个类型的方法(Method),而不是包级函数。例如 time.Time.Format 中的 Format 是 Time 类型的方法。点击后页面会展示该方法的接收者类型、签名和示例。如果你只想看包级函数,搜索时加前缀 pkg. 即可,比如 time. 会只显示 time 包的顶层函数。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。