go 常用开源库汇总

󰃭 2022-07-14

go 常用开源库列表

选择的项目都是知名的有大量开发者使用的,满足以下条件

  • 500 星以上,fork 百次以上
  • 长期更新这个列表的项目情况,方便查找
项目名 简介 文档地址 项目地址 Star Fork
gorm orm 数据库访问 文档 https://github.com/go-gorm/gorm 28.9k 3.2k
gin golang 开发的高性能 web 框架 文档 https://github.com/gin-gonic/gin 61k 6.8k
lo 处理数组、map等集合数据的算法库 文档 https://github.com/samber/lo 6.8k 263
viper 配置文件处理的库, 支持各种格式、远程本地的配置文件 文档 https://github.com/spf13/viper 19.9k 1.7k
Loki 轻量级日志收集系统,替换ELK 文档 https://github.com/grafana/loki 16.5k 2.1k
Prometheus Prometheus 是一款基于时序数据库的开源系统 文档 https://github.com/prometheus/prometheus 43.4k 7.3k
swaggo Swagger 自动生成api接口文档 文档 https://github.com/swaggo/swag 6.4k 864
jaeper uber 开源的分布式链路追踪系统的 golang 客户端 文档 https://github.com/jaegertracing/jaeger-client-go 1.3k 280
lumberjack lumberjack是一个日志滚动记录器 文档 https://github.com/natefinch/lumberjack 3.4k 446
zap uber 开源的日志库 文档 https://github.com/uber-go/zap 16.4k 1.2k

go 常用开源库具体功能介绍

Gin Web框架

功能

安装

go get -u github.com/gin-gonic/gin

快速入门

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	 := gin.Default()
	r.GET("/ping", func(c *gin.Context) {
		c.JSON(http.StatusOK, gin.H{
			"message": "pong",
		})
	})
	r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}

Gorm 介绍

功能

  • 全功能 ORM
  • 关联 (Has One,Has Many,Belongs To,Many To Many,多态,单表继承)
  • Create,Save,Update,Delete,Find 中钩子方法
  • 支持 Preload、Joins 的预加载
  • 事务,嵌套事务,Save Point,Rollback To Saved Point
  • Context、预编译模式、DryRun 模式
  • 批量插入,FindInBatches,Find/Create with Map,使用 SQL 表达式、Context Valuer 进行 CRUD
  • SQL 构建器,Upsert,数据库锁,Optimizer/Index/Comment Hint,命名参数,子查询
  • 复合主键,索引,约束
  • Auto Migration
  • 自定义 Logger
  • 灵活的可扩展插件 API:Database Resolver(多数据库,读写分离)、Prometheus…

安装

go get -u gorm.io/gorm
go get -u gorm.io/driver/sqlite

快速入门

package main

import (
  "gorm.io/gorm"
  "gorm.io/driver/sqlite"
)

type Product struct {
  gorm.Model
  Code  string
  Price uint
}

func main() {
  db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
  if err != nil {
    panic("failed to connect database")
  }

  // 迁移 schema
  db.AutoMigrate(&Product{})

  // Create
  db.Create(&Product{Code: "D42", Price: 100})

  // Read
  var product Product
  db.First(&product, 1) // 根据整型主键查找
  db.First(&product, "code = ?", "D42") // 查找 code 字段值为 D42 的记录

  // Update - 将 product 的 price 更新为 200
  db.Model(&product).Update("Price", 200)
  // Update - 更新多个字段
  db.Model(&product).Updates(Product{Price: 200, Code: "F42"}) // 仅更新非零值字段
  db.Model(&product).Updates(map[string]interface{}{"Price": 200, "Code": "F42"})

  // Delete - 删除 product
  db.Delete(&product, 1)
}

viper 介绍

功能

  • go 配置文件解决方案,被设计支持所有类型的配置文件
  • 可以读区 JSON, TOML, YAML, HCL, envfile 等类型配置文件
  • 检查配置文件的变化,重新加载配置
  • 从环境变量、命令行读区配置
  • 从内存 buffer 读区配置
  • 从分布式配置系统 etcd、consul 读取配置

安装

go get github.com/spf13/viper

快速入门

package main

import (
	"flag"
	"github.com/spf13/pflag"
)

func main() {

	// using standard library "flag" package
	flag.Int("flagname", 1234, "help message for flagname")

	pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
	pflag.Parse()
	viper.BindPFlags(pflag.CommandLine)

	i := viper.GetInt("flagname") // retrieve value from viper

	// ...
}

Loki 介绍

Loki 是一套水平扩展、高可用、多租户日志聚合系统,它受到 Prometheus 的启发。它被设计非常有效率,而且很容易去使用。它没有创建全文索引,根据标签进行构建聚合

功能

  • 不创建全文索引,数据压缩存储、解析日志创建 metadata 索引,使用简单、成本低
  • 索引和日志组使用与 Prometheus 一样的标签,在日志和 metric 之间切换很简单
  • 特别适合 K8S 的 POD 日志,POD 标签的metadata 自动被获取和索引
  • Grafana 原生支持(Grafana v6.0 以后)

组件

  • Promtail:日志收集器,类似Filebeat,收集日志文件的日志,把收集到的数据推送到Loki存储
  • Loki:聚合并存储日志数据,作为Grafana的数据源,为Grafana提供可视化数据
  • Grafana:从Loki中获取日志数据,进行可视化展示

Prometheus 介绍

Prometheus 是一款基于时序数据库的开源系统、服务监控告警系统。它按照一定时间间隔采集配置的目标的指标,按照配置的规则评估、显示结果。通过设置的观察条件来触发告警

功能

  • 支持多维数据模型, 由度量名和键值对组成的时间序列数据
  • 内置时间序列数据库TSDB
  • 支持PromQL查询语言,可以完成复杂的查询和分析
  • 使用 HTTP Pull 方式收集时间序列数据
  • 通过内部网关来支持批量的采集任务
  • 支持服务发现和静态配置两种方式发现目标
  • 支持多种模式的图形、仪表盘展示
  • 支持接入Grafana 进行丰富的监控指标展示