首页 > 其他分享 >推荐 10 个非常有用的 Golang Libraries

推荐 10 个非常有用的 Golang Libraries

时间:2024-03-27 20:44:27浏览次数:28  
标签:10 github err Libraries Go Golang go cases com

推荐 10 个非常有用的 Golang Libraries

原创 Go Official Blog Go Official Blog 2024-03-25 18:16 山东 听全文

Go 语言的标准库非常好用。通常情况下,你不需要任何额外的库来完成任务。

但是在某些情况下,可能需要使用一些库。今天将与你分享日常工作中很有用的 10 个 Go 库:

1. cmp

该包旨在成为 reflect.DeepEqual 的更强大、更安全的替代品,用于比较两个值是否在语义上相等。它仅用于测试中,因为性能不是目标,如果无法比较这些值,可能会导致程序崩溃。

Example:

// This Transformer sorts a []int.
 trans := cmp.Transformer("Sort", func(in []int) []int {
  out := append([]int(nil), in...) // Copy input to avoid mutating it
  sort.Ints(out)
  return out
 })

 x := struct{ Ints []int }{[]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}}
 y := struct{ Ints []int }{[]int{2, 8, 0, 9, 6, 1, 4, 7, 3, 5}}
 z := struct{ Ints []int }{[]int{0, 0, 1, 2, 3, 4, 5, 6, 7, 8}}

 fmt.Println(cmp.Equal(x, y, trans))
 fmt.Println(cmp.Equal(y, z, trans))
 fmt.Println(cmp.Equal(z, x, trans))

相关链接[1]

2. protobuf

该项目托管了协议缓冲区(Protocol Buffers)的 Go 语言实现,协议缓冲区是一种与语言无关、平台无关、可扩展的机制,用于序列化结构化数据。协议缓冲区语言是一种用于指定结构化数据模式的语言。

Protocol buffers:

协议缓冲区(Protocol Buffers)是 Google 的一种与语言无关、平台无关、可扩展的机制,用于序列化结构化数据。可以将其想象成 XML,但它更小、更快、更简单。你只需定义一次数据的结构,然后就可以使用特殊生成的源代码轻松地将结构化数据写入各种数据流中,并从中读取,同时还可以使用各种编程语言进行操作。

相关链接[2]

3. fsnotify

fsnotify 是一个 Go 语言库,用于在 Windows、Linux、macOS、BSD 和 illumos 上提供跨平台的文件系统通知功能。

Example:

package main

import (
    "log"

    "github.com/fsnotify/fsnotify"
)

func main() {
    // Create new watcher.
    watcher, err := fsnotify.NewWatcher()
    if err != nil {
        log.Fatal(err)
    }
    defer watcher.Close()

    // Start listening for events.
    go func() {
        for {
            select {
            case event, ok := <-watcher.Events:
                if !ok {
                    return
                }
                log.Println("event:", event)
                if event.Has(fsnotify.Write) {
                    log.Println("modified file:", event.Name)
                }
            case err, ok := <-watcher.Errors:
                if !ok {
                    return
                }
                log.Println("error:", err)
            }
        }
    }()

    // Add a path.
    err = watcher.Add("/tmp")
    if err != nil {
        log.Fatal(err)
    }

    // Block main goroutine forever.
    <-make(chan struct{})
}

相关链接[3]

4. pretty

该包利用反射来检查 Go 值,并可以以漂亮、对齐的方式打印出来。它支持三种模式(普通、紧凑和扩展)以供高级使用。

Examples:

package main

import (
 "github.com/kylelemons/godebug/pretty"
)

func main() {
 type ShipManifest struct {
  Name     string
  Crew     map[string]string
  Androids int
  Stolen   bool
 }

 manifest := &ShipManifest{
  Name: "Spaceship Heart of Gold",
  Crew: map[string]string{
   "Zaphod Beeblebrox": "Galactic President",
   "Trillian":          "Human",
   "Ford Prefect":      "A Hoopy Frood",
   "Arthur Dent":       "Along for the Ride",
  },
  Androids: 1,
  Stolen:   true,
 }

 pretty.Print(manifest)

}

相关链接[4]

5. diff

diff 实现了一种逐行的差异算法。

Example result:

-:wq
 We the People of the United States, in Order to form a more perfect Union,
 establish Justice, insure domestic Tranquility, provide for the common defence,
-and secure the Blessings of Liberty to ourselves
+promote the general Welfare, and secure the Blessings of Liberty to ourselves
 and our Posterity, do ordain and establish this Constitution for the United
 States of America.

相关链接[5]

6. cases

Package cases 提供了通用和特定语言的大小写映射器。

Examples:

package main

import (
 "fmt"

 "golang.org/x/text/cases"
 "golang.org/x/text/language"
)

func main() {
 src := []string{
  "hello world!",
  "i with dot",
  "'n ijsberg",
  "here comes O'Brian",
 }
 for _, c := range []cases.Caser{
  cases.Lower(language.Und),
  cases.Upper(language.Turkish),
  cases.Title(language.Dutch),
  cases.Title(language.Und, cases.NoLower),
 } {
  fmt.Println()
  for _, s := range src {
   fmt.Println(c.String(s))
  }
 }

}

相关链接[6]

7. cli

cli 是一个简单、快速、有趣的 Go 语言包,用于构建命令行应用程序。其目标是让开发人员以富有表现力的方式编写快速且可分发的命令行应用程序。

Examples:

func main() {
 app := &cli.App{
    Name: "greet",
    Usage: "say a greeting",
    Action: func(c *cli.Context) error {
     fmt.Println("Greetings")
     return nil
    },
 }

 app.Run(os.Args)
}

相关链接[7]

8. Testify

Go 代码(golang)是一组提供了许多工具的软件包,用于确保您的代码将按照您的意图运行。

Examples:

package yours

import (
  "testing"
  "github.com/stretchr/testify/assert"
)

func TestSomething(t *testing.T) {

  // assert equality
  assert.Equal(t, 123, 123, "they should be equal")

  // assert inequality
  assert.NotEqual(t, 123, 456, "they should not be equal")

  // assert for nil (good for errors)
  assert.Nil(t, object)

  // assert for not nil (good when you expect something)
  if assert.NotNil(t, object) {

    // now we know that object isn't nil, we are safe to make
    // further assertions without causing any errors
    assert.Equal(t, "Something", object.Value)

  }

}

相关链接[8]

9. go-homedir

用于检测和扩展用户的主目录,无需使用cgo。

Examples[9]

10. gabs

用于在Go中解析、创建和编辑未知或动态JSON的包。

Examples:

jsonParsed, err := gabs.ParseJSON([]byte(`{
 "outer":{
  "inner":{
   "value1":10,
   "value2":22
  },
  "alsoInner":{
   "value1":20,
   "array1":[
    30, 40
   ]
  }
 }
}`))
if err != nil {
 panic(err)
}

var value float64
var ok bool

value, ok = jsonParsed.Path("outer.inner.value1").Data().(float64)
// value == 10.0, ok == true

value, ok = jsonParsed.Search("outer", "inner", "value1").Data().(float64)
// value == 10.0, ok == true

value, ok = jsonParsed.Search("outer", "alsoInner", "array1", "1").Data().(float64)
// value == 40.0, ok == true

相关链接[10]

参考资料[1]

cmp: https://pkg.go.dev/github.com/google/go-cmp/cmp

[2]

protobuf: https://pkg.go.dev/google.golang.org/protobuf

[3]

fsnotify: https://pkg.go.dev/github.com/fsnotify/fsnotify#section-readme

[4]

pretty: https://pkg.go.dev/github.com/kylelemons/godebug/pretty?utm_source=godoc#example-Print

[5]

diff: https://pkg.go.dev/github.com/kylelemons/[email protected]/diff

[6]

cases: https://pkg.go.dev/golang.org/x/[email protected]/cases#example-package

[7]

cli: https://pkg.go.dev/github.com/urfave/cli/v2#section-readme

[8]

testify: https://pkg.go.dev/github.com/stretchr/testify#section-readme

[9]

go-homedir: https://github.com/mitchellh/go-homedir

[10]

gabs: https://github.com/Jeffail/gabs

 

Go Official Blog

 你的肯定是对我最大的鼓励 

赞赏二维码喜欢作者

Golang20 Go blog 合集20 golang11 Golang · 目录 上一篇Go 语言设计者 Robert Griesemer 深入介绍泛型下一篇Golang Concepts: Nil Channels 阅读 1135 Go Official Blog ​ 喜欢此内容的人还喜欢   让你的 Golang 应用 Dokcer Build Image 加速 20X     Go Official Blog 不看的原因   Shell学习从入门到精通(一)     今晚务必早点睡 不看的原因   Go语言的100个错误使用场景(21-29)|数据类型     白泽talk 不看的原因   关注公众号后可以给作者发消息           复制投诉      

人划线

 

标签:10,github,err,Libraries,Go,Golang,go,cases,com
From: https://www.cnblogs.com/cheyunhua/p/18100189

相关文章

  • 深度学习第二周:CIFAR10彩色图片识别
    一、前期准备1.设置GPUimporttorchimporttorch.nnasnnimportmatplotlib.pyplotaspltimporttorchvision#设置硬件设备,如果有GPU则使用,没有则使用cpudevice=torch.device("cuda"iftorch.cuda.is_available()else"cpu")Output:device(type='cuda&#......
  • P1036 [NOIP2002 普及组] 选数
    思路:也算典型的dfs,题目就是要求从n个数中选择k个数,计算这k个数的和,看这个和是否是素数。我们知道在dfs时相当于是进行全排列,而结果要求的是组合后和的情况。根据排列和组合的关系,他们之间差K!倍,所以需要在dfs求得个数cnt后除以k!。题目:AC代码:#include<algorithm>#include<io......
  • abc310D 带限制的分组方案数
    将n个人分成T组,有m条限制条件,第i个条件为{a[i],b[i]},表示a[i]与b[i]不能分到同一组,问总共有多少种可行的分组方案?1<=T<=n<=10由于最多只有10人,直接爆搜也能过,可以再加个剪枝:如果剩下人每人单独一组都不够T组则不可行。另外,为了去重,可以按编号从小到大的顺序,依次考虑每个人,要么加......
  • win10 docker zookeeper和kafka搭建
    好久没用参与大数据之类的开发了,近日接触到一个项目中使用到kafka,因此要在本地搭建一个简易的kafka服务。时间比较紧急,之前有使用docker的经验,因此本次就使用docker来完成搭建。在搭建过程中出现的一些问题,及时记录,以便后期再遇见。环境计算机环境:win1022H2dockerVersio......
  • tab页切换导致echart图宽高仅100px问题
    页面切换导致echart图宽高仅100px问题,图表的宽度可能没有正确更新,导致显示不正确。为了解决这个问题,你需要确保在切换标签页时触发ECharts实例的resize方法,以便图表可以正确地调整到新的容器尺寸。//假设你已经有一个ECharts实例varmyChart=echarts.init(document.getEl......
  • 速度与效率的双赢:探索ADOP 100G多模光模块的优势
    当今通信行业的快速发展,对数据传输速度和稳定性的要求日益增高。ADOP品牌的100G多模光模块正是在这样的背景下应运而生,它不仅提供了高速的数据传输能力,而且还具有多种优势,使其成为数据中心和高性能计算网络的理想选择。产品概述: ADOP的100GQSFP28SR4多模光模块是一款高性能......
  • 中国 10 亿参数规模以上大模型数量已超 100 个;GitHub 推出代码自动修复工具丨 RTE 开
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢......
  • LeetCodeHot100 链表 160. 相交链表 206. 反转链表 234. 回文链表 141. 环形链表
    160.相交链表https://leetcode.cn/problems/intersection-of-two-linked-lists/description/?envType=study-plan-v2&envId=top-100-likedpublicListNodegetIntersectionNode(ListNodeheadA,ListNodeheadB){intlenA=0;intlenB=0;L......
  • 1094. 拼车(中)
    目录题目题解:差分数组题目车上最初有capacity个空座位。车只能向一个方向行驶(也就是说,不允许掉头或改变方向)给定整数capacity和一个数组trips,trip[i]=[numPassengersi,fromi,toi]表示第i次旅行有numPassengersi乘客,接他们和放他们的位置分别是fromi和......
  • .net6 core web项目发布部署到IIS,以Windows服务的形式部署启动,报错1053,报1067错误解
    安装NuGet包Microsoft.Extensions.Hosting.WindowsServices  varbuilder=WebApplication.CreateBuilder(newWebApplicationOptions{ContentRootPath=AppContext.BaseDirectory,Args=args});//Addservicestothecontainer.builder.Services.Add......