Go 生态中有许多优秀的第三方包,以下是一些常用且高质量的包推荐,涵盖不同领域:
1. 验证:go-playground/validator
用于结构体验证,支持标签定义验证规则。
package main
import (
"fmt"
"github.com/go-playground/validator/v10"
)
type User struct {
Email string `validate:"required,email"`
Age int `validate:"gte=18"`
}
func main() {
validate := validator.New()
user := User{Email: "test@example.com", Age: 20}
err := validate.Struct(user)
if err != nil {
fmt.Println(err)
}
}
2. JSON 解析:tidwall/gjson
快速提取 JSON 中的字段,无需解析整个结构。
package main
import (
"fmt"
"github.com/tidwall/gjson"
)
func main() {
json := `{"user": {"name": "John", "age": 30}}`
value := gjson.Get(json, "user.name")
fmt.Println(value.String()) // 输出: John
}
3. XML 解析:antchfx/xmlquery
类似 XPath 的 XML 解析库。
package main
import (
"fmt"
"github.com/antchfx/xmlquery"
)
func main() {
xml := `<book><title>Go Programming</title></book>`
doc, _ := xmlquery.Parse(strings.NewReader(xml))
title := xmlquery.FindOne(doc, "//title")
fmt.Println(title.InnerText()) // 输出: Go Programming
}
4. HTML 解析:PuerkitoBio/goquery
提供 jQuery 风格的 HTML 解析和操作。
package main
import (
"fmt"
"github.com/PuerkitoBio/goquery"
)
func main() {
html := `<html><body><div class="content">Hello</div></body></html>`
doc, _ := goquery.NewDocumentFromReader(strings.NewReader(html))
doc.Find(".content").Each(func(i int, s *goquery.Selection) {
fmt.Println(s.Text()) // 输出: Hello
})
}
5. 统计计算:montanaflynn/stats
提供统计函数,如均值、中位数、标准差等。
package main
import (
"fmt"
"github.com/montanaflynn/stats"
)
func main() {
data := []float64{1.0, 2.0, 3.0, 4.0}
mean, _ := stats.Mean(data)
fmt.Println(mean) // 输出: 2.5
}
6. 配置管理:spf13/viper
支持多种格式的配置管理(JSON、YAML、环境变量等)。
package main
import (
"fmt"
"github.com/spf13/viper"
)
func main() {
viper.SetConfigFile("config.yaml")
viper.ReadInConfig()
port := viper.GetInt("server.port")
fmt.Println(port)
}
7. 日志记录:sirupsen/logrus
结构化日志记录库,支持 hooks 和自定义格式。
package main
import (
"github.com/sirupsen/logrus"
)
func main() {
log := logrus.New()
log.WithFields(logrus.Fields{
"user": "john",
}).Info("User logged in")
}
8. HTTP 客户端:go-resty/resty
简化 HTTP 客户端操作,支持重试、中间件等功能。
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
resp, _ := client.R().Get("https://api.example.com/data")
fmt.Println(resp.Status())
}
这些包在 GitHub 上均有高星标和活跃维护,可根据项目需求选择使用。