最推荐用 http.ParseMediaType 解析 Content-Type 字符串,它能正确拆分主/子类型及参数;mime.TypeByExtension 用于扩展名推断类型,ExtensionsByType 用于反向查扩展名,自定义注册需在 init 阶段调用。

Go 标准库的 mime 包主要用于 MIME 类型的解析、匹配和注册,但它本身不直接解析 HTTP 请求头中的 Content-Type 字符串(比如带参数的 text/plain; charset=utf-8)。真正负责解析 Content-Type 的是 net/http 包里的 http.ParseMediaType 函数——它底层会调用 mime 的能力,但提供了更完整的语义支持。
用 http.ParseMediaType 解析 Content-Type 字符串
这是最常用、最推荐的方式。它能正确拆分主类型、子类型和参数(如 charset、boundary),并处理转义和空格等边界情况。
- 返回值:MIME 类型字符串(如
text/html)、参数 map(如map[string]string{"charset": "utf-8"})、以及可能的错误 - 示例:
mediaType, params, err := http.ParseMediaType("multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW")
if err != nil {
log.Fatal(err)
}
fmt.Println(mediaType) // multipart/form-data
fmt.Println(params["boundary"]) // ----WebKitFormBoundary7MA4YWxkTrZu0gW
```
用 mime.TypeByExtension 推断文件扩展名对应的 MIME 类型
适合根据文件后缀(如 .jpg、.json)快速获取标准 MIME 类型,常用于静态文件服务或上传文件类型校验。
- 注意:它只查内置映射表,不读取文件内容;对不常见后缀可能返回空字符串
- 可配合
mime.AddExtensionType注册自定义映射 - 示例:
typ := mime.TypeByExtension(".svg") // 返回 "image/svg+xml"
if typ == "" {
typ = "application/octet-stream"
}
```
用 mime.ExtensionsByType 查询某 MIME 类型对应的所有已知扩展名
反向查找,适合做类型标准化或生成推荐后缀。返回的是字符串切片,顺序按常见度排列(如 "text/plain" 返回 []string{".txt", ".text", ".conf"})。
立即学习“go语言免费学习笔记(深入)”;
- 结果依赖于标准库内置注册表,不含用户自定义项
- 若类型未注册,返回空切片
手动注册自定义 MIME 类型(需谨慎)
使用 mime.AddExtensionType 或 mime.AddMimeType 可扩展内置表,但必须在程序早期(如 init())调用,且不能覆盖已有映射(会 panic)。
mime.AddExtensionType(".webp", "image/webp")mime.AddMimeType("application/vnd.myapp+json", ".myj")- 仅影响
TypeByExtension和ExtensionsByType,不影响ParseMediaType
不复杂但容易忽略:Content-Type 解析逻辑应交由 http.ParseMediaType,mime 包更适合做类型推断与注册。两者分工明确,混用反而增加出错风险。










