Skip to content

Latest commit

 

History

History
1129 lines (1016 loc) · 100 KB

golang.md

File metadata and controls

1129 lines (1016 loc) · 100 KB

Golang知识

  • 50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs

    • 初级
      • 不允许左大括号单独一行
      • 不允许出现未使用的变量
      • 不允许出现未使用的import (使用_作为引入包别名)
      • 短的变量声明(Short Variable Declarations)只能在函数内部使用
      • 不能使用短变量声明(Short Variable Declarations)重复声明
      • 不能使用短变量声明(Short Variable Declarations)这种方式来设置字段值
      • 意外的变量幽灵(Accidental Variable Shadowing)(代码块中使用短变更声明与外部相同的变量时,没有语法编译错误,但是代码块中同名短变量声明从声明开始到代码块结束,对变量的修改将不会影响到外部变量!这种现象称之为幽灵变量,可以使用go tool vet -shadow you_file.go检查幽灵变量。)
      • 不能使用nil初始化一个未指定类型的变量
      • 不能直接使用nil值的Slice和Map
      • map使用make分配内存时可指定capicity,但是不能对map使用cap函数
      • 字符串不允许使用nil值
      • 数组用于函数传参时是值复制,应该叫做值传递
      • range关键字返回是键值对,而不是值
      • Slice和Array是一维的, Go表面上看起来像多维的,实际上只是一维的。但可以使用原始的一维数组、一维的切片来实现多维。(待分析验证)
      • 从不存在key的map中取值时,返回的总是”0值”,x[key]需要判断是否存在key
      • 字符串是不可变
      • 字符串与[]byte之间的转换是复制(有内存损耗),可以用map[string] []byte建立字符串与[]byte之间映射,也可range来避免内存分配来提高性能
      • string的索引操作返回的是byte(或uint8),如想获取字符可使用for range,也可使用unicode/utf8包和golang.org/x/exp/utf8string包的At()方法。
      • 字符串并不总是UTF8的文本
      • len(str)返回的是字符串的字节数,获取字符串的rune数是使用unicode/utf8.RuneCountInString()函数,但注意一些字符也可能是由多个rune组成,如é是两个rune组成。
      • 在Slice、Array、Map的多行书写最后的逗号不可省略
      • 内置数据结构的操作并不同步,但可把Go提供了并发的特性使用起来:goroutines和channels。
      • 使用for range迭代String,是以rune来迭代的。
      • rune是什么,int32的别名,几乎在所有方面等同于int32,它用来区分字符值和整数值,所以在go语言中引进了rune的概念。在我们对字符串进去处理的时候只需要将字符串通过range去遍历,会按照rune为单位自动去处理,极其便利。
      • 一个字符,也可以有多个rune组成。需要处理字符,尽量使用golang.org/x/text/unicode/norm包。
      • 使用for range迭代map时每次迭代的顺序可能不一样,因为map的迭代是随机的。
      • switch的case默认匹配规则不同于其它语言的是,匹配case条件后默认退出,除非使用fallthrough继续匹配;而其它语言是默认继续匹配,除非使用break退出匹配。
      • 只有后置自增、后置自减,不存在前置自增、前置自减
      • 位运算的非操作是^(跟异或位运算一样),有别于其它语言的~。
      • 位运算(与、或、异或、取反)优先级高于四则运算(加、减、乘、除、取余),有别于C语言。
      • 结构体在序列化时非导出字段(以小写字母开头的字段名)不会被encode,因此在decode时这些非导出字段的值为”0值”
      • 程序不等所有goroutine结束就会退出。可通过channel实现主协程(main goroutine)等待所有goroutine完成。
      • 对于无缓存区的channel,写入channel的goroutine会阻塞直到被读取,读取channel的goroutine会阻塞直到有数据写入。
      • 从一个closed状态的channel读取数据是安全的,可通过返回状态(第二个返回参数)判断是否关闭;而向一个closed状态的channel写数据会导致panic。
      • 向一个nil值(未用make分配空间)的channel发送或读取数据,会导致永远阻塞。
      • 方法函数的定义;方法接收者是类型(T),接收者只是原对象的值复制,在方法中修改接收者不会修改原始对象的值;如果方法接收者是指针类型(*T),是对原对象的引用,方法中对其修改当然是原对象修改。
      • log包中的log.Fatal和log.Panic不仅仅记录日志,还会中止程序。它不同于Logging库。
    • 中级
      • 关闭HTTP的Response.Body,使用defer语句关闭资源时要注意nil值,在defer语句之前要进行nill值处理;在Go 1.5之前resp.Body.Close()会读取并丢失body中的数据,保证在启用keepaliva的http时能够在下一次请求时重用。在Go 1.5之后,就需要在关闭前手动处理。
      • 关闭HTTP连接:可使用req.Close=true,表示在http请求完成时关闭连接;添加Connection: close的连接请求头。http服务端也会发送Connection: close的响应头,http库处理响应时会关闭连接。
      • 全局关闭http连接重用。
      • Json反序列化数字到interface{}类型的值中,默认解析为float64类型,在使用时要注意。使用Decoder类型解析JSON;使用struct结构体映射;使用struct映射数字为json.RawMessage
      • Struct、Array、Slice、Map的比较;如果struct结构体的所有字段都能够使用==操作比较,那么结构体变量也能够使用==比较。但是,如果struct字段不能使用==比较,那么结构体变量使用==比较会导致编译错误。同样,array只有在它的每个元素能够使用==比较时,array变量才能够比较。Go提供了一些用于比较不能直接使用==比较的函数,其中最常用的是reflect.DeepEqual()函数。DeepEqual()函数对于nil值的slice与空元素的slice是不相等的,这点不同于bytes.Equal()函数。
      • 从panic中恢复:recover()函数能够捕获或拦截panic,但必须在defer函数或语句中直接调用,否则无效。
      • 在slice、array、map的for range子句中修改和引用数据项;使用range获取的数据项是从集合元素的复制过来的,并非引用原始数据,但使用索引能访问原始数据。
      • Slice中的隐藏数据,从一个slice上再生成一个切片slice,新的slice将直接引用原始slice的那个数组,两个slice对同一数组的操作,会相互影响。可通过为新切片slice重新分配空间,从slice中copy部分的数据来避免相互之间的影响。
      • Slice超范围数据覆盖,从已存在的切片slice中继续切片时,新切片的capicity等于原capicity减去新切片之前部分的数量,新切片与原切片都指向同一数组空间。新生成切片之间capicity区域是重叠的,因此在添加数据时易造成数据覆盖问题。slice使用append添加的内容时超出capicity时,会重新分配空间。利用这一点,将要修改的切片指定capicity为切片当前length,可避免切片之间的超范围覆盖影响。
      • Slice增加元素重新分配内存导致的怪事,slice在添加元素前,与其它切片共享同一数据区域,修改会相互影响;但添加元素导致内存重新分配之后,不再指向原来的数据区域,修改元素,不再影响其它切片。
      • 类型重定义与方法继承,从一个已存在的(non-interface)非接口类型重新定义一个新类型时,不会继承原类型的任何方法。可以通过定义一个组合匿名变量的类型,来实现对此匿名变量类型的继承。但是从一个已存在接口重新定义一个新接口时,新接口会继承原接口所有方法。
      • 从”for switch”和”for select”代码块中跳出。无label的break只会跳出最内层的switch/select代码块。如需要从switch/select代码块中跳出外层的for循环,可以在for循环外部定义label,供break跳出。return当然也是可以的,如果在这里可以用的话。
      • 在for语句的闭包中使用迭代变量会有问题,在for迭代过程中,迭代变量会一直保留,只是每次迭代值不一样。因此在for循环中在闭包里直接引用迭代变量,在执行时直接取迭代变量的值,而不是闭包所在迭代的变量值。如果闭包要取所在迭代变量的值,就需要for中定义一个变量来保存所在迭代的值,或者通过闭包函数传参。
      • defer函数调用参数,defer后面必须是函数或方法的调用语句。defer后面不论是函数还是方法,输入参数的值是在defer声明时已计算好,而不是调用开始计算。要特别注意的是,defer后面是方法调用语句时,方法的接受者是在defer语句执行时传递的,而不是defer声明时传入的。
      • defer语句调用是在当前函数结束之后调用,而不是变量的作用范围。
      • 失败的类型断言,var.(T)类型断言失败时会返回T类型的“0值”,而不是变量原始值。
      • 阻塞的goroutine与资源泄漏
    • 高级
      • 用值实例上调用接收者为指针的方法,对于可寻址(addressable)的值变量(而不是指针),可以直接调用接受对象为指针类型的方法。换句话说,就不需要为可寻址值变量定义以接受对象为值类型的方法了。但是,并不是所有变量都是可寻址的,像Map的元素就是不可寻址的。
      • 更新map值的字段,如果map的值类型是结构体类型,那么不能更新从map中取出的结构体的字段值。但是对于结构体类型的slice却是可以的。
      • nil值的interface{}不等于nil。在golang中,nil只能赋值给指针、channel、func、interface、map或slice类型的变量。interface{}表示任意类型,可以接收任意类型的值。interface{}变量在底是由类型和值两部分组成,表示为(T,V),interface{}变量比较特殊,判断它是nil时,要求它的类型和值都是nil,即(nil, nil)。其它类型变量,只要值是nil,那么此变量就是nil(为什么?变量类型不是nil,那当然只能用值来判断了)。声明变量interface{},它默认就是nil,底层类型与值表示是(nil, nil)。当任何类型T的变量值V给interface{}变量赋值时,interface{}变量的底层表示是(T, V)。只要T非nil,即使V是nil,interface{}变量也不是nil。因此,var a interface{}、var a interface{} = nil、“
      • 变量内存的分配,在C++中使用new操作符总是在heap上分配变量。Go编译器使用new()和make()分配内存的位置到底是stack还是heap,取决于变量的大小(size)和逃逸分析的结果(result of “escape analysis”)。这意味着Go语言中,返回本地变量的引用也不会有问题。要想知道变量内存分配的位置,可以在go build、go run命令指定-gcflags -m即可:go run -gcflags -m app.go
      • GOMAXPROCS、Concurrency和Parallelism。Go 1.4及以下版本每个操作系统线程只使用一个执行上下文execution context)。这意味着每个时间片,只有一个goroutine执行。从Go 1.5开始可以设置执行上下文的数量为CUP内核数量runtime.NumCPU(),也可以通过GOMAXPROCS环境变量来设置,还可调用runtime.GOMAXPROCS()函数来设置。注意,GOMAXPROCS并不代表Go运行时能够使用的CPU数量,它是一个小256的数值,可以设置比实际的CPU数量更大的数字。
      • 读写操作排序,Go可能会对一些操作排序,但它保证在goroutine的所有行为保持不变。但是,它无法保证在跨多个goroutine时的执行顺序。
      • 优先调度,有一些比较流氓的goroutine会阻止其它goroutine的执行。例如for循环可能就不允许调度器(scheduler)执行。scheduler会在GC、go语句、阻塞channel的操作、阻塞系统调用、lock操作等语句执行之后立即执行。也可以显示地执行runtime.Gosched()(让出时间片)使scheduler执行调度工作。
      • Append
  • 基础入门

  • 进阶

    • Golang内存逃逸是什么?怎么避免内存逃逸?

      • go build -gcflags=-m
      • 为什么要逃逸分析:Go的垃圾回收,让堆和栈对程序员保持透明。真正解放了程序员的双手,让他们可以专注于业务,“高效”地完成代码编写。把那些内存管理的复杂机制交给编译器,而程序员可以去享受生活。逃逸分析这种“骚操作”把变量合理地分配到它该去的地方,“找准自己的位置”。即使你是用new申请到的内存,如果我发现你竟然在退出函数后没有用了,那么就把你丢到栈上,毕竟栈上的内存分配比堆上快很多;反之,即使你表面上只是一个普通的变量,但是经过逃逸分析后发现在退出函数之后还有其他地方在引用,那我就把你分配到堆上。真正地做到“按需分配”!如果变量都分配到堆上,堆不像栈可以自动清理。它会引起Go频繁地进行垃圾回收,而垃圾回收会占用比较大的系统开销(占用CPU容量的25%)。堆和栈相比,堆适合不可预知大小的内存分配。但是为此付出的代价是分配速度较慢,而且会形成内存碎片。栈内存分配则会非常快。栈分配内存只需要两个CPU指令:“PUSH”和“RELEASE”,分配和释放;而堆分配内存首先需要去找到一块大小合适的内存块,之后要通过垃圾回收才能释放。
      • 通过逃逸分析,可以尽量把那些不需要分配到堆上的变量直接分配到栈上,堆上的变量少了,会减轻分配堆内存的开销,同时也会减少gc的压力,提高程序的运行速度。
      • Go逃逸分析最基本的原则是:如果一个函数返回对一个变量的引用,那么它就会发生逃逸。
      • 任何时候,一个值被分享到函数栈帧范围之外,它都会在堆上被重新分配。
      • 简单来说,编译器会分析代码的特征和代码生命周期,Go中的变量只有在编译器可以证明在函数返回后不会再被引用的,才分配到栈上,其他情况下都是分配到堆上。
      • Go语言里没有一个关键字或者函数可以直接让变量被编译器分配到堆上,相反,编译器通过分析代码来决定将变量分配到何处。
      • 简单来说,编译器会根据变量是否被外部引用来决定是否逃逸:如果函数外部没有引用,则优先放到栈中;如果函数外部存在引用,则必定放到堆中;
      • 逃逸的常见情况
        • 发送指针的指针或值包含了指针到 channel 中,由于在编译阶段无法确定其作用域与传递的路径,所以一般都会逃逸到堆上分配。
        • slices 中的值是指针的指针或包含指针字段。一个例子是类似[] *string 的类型。这总是导致 slice 的逃逸。即使切片的底层存储数组仍可能位于堆栈上,数据的引用也会转移到堆中。
        • slice 由于 append 操作超出其容量,因此会导致 slice 重新分配。这种情况下,由于在编译时 slice 的初始大小的已知情况下,将会在栈上分配。如果 slice 的底层存储必须基于仅在运行时数据进行扩展,则它将分配在堆上。
        • 调用接口类型的方法。接口类型的方法调用是动态调度 - 实际使用的具体实现只能在运行时确定。考虑一个接口类型为 io.Reader 的变量 r。对 r.Read(b) 的调用将导致 r 的值和字节片b的后续转义并因此分配到堆上。 参考 http://npat-efault.github.io/programming/2016/10/10/escape-analysis-and-interfaces.html
        • 尽管能够符合分配到栈的场景,但是其大小不能够在在编译时候确定的情况,也会分配到堆上
      • 逃逸如何避免
        • go 中的接口类型的方法调用是动态调度,因此不能够在编译阶段确定,所有类型结构转换成接口的过程会涉及到内存逃逸的情况发生。如果对于性能要求比较高且访问频次比较高的函数调用,应该尽量避免使用接口类型。
        • 由于切片一般都是使用在函数传递的场景下,而且切片在 append 的时候可能会涉及到重新分配内存,如果切片在编译期间的大小不能够确认或者大小超出栈的限制,多数情况下都会分配到堆上。
      • 堆上动态分配内存比栈上静态分配内存,开销大很多。
      • 变量分配在栈上需要能在编译期确定它的作用域,否则会分配到堆上。
      • Go编译器会在编译期对考察变量的作用域,并作一系列检查,如果它的作用域在运行期间对编译器一直是可知的,那么就会分配到栈上。简单来说,编译器会根据变量是否被外部引用来决定是否逃逸。
      • 对于Go程序员来说,编译器的这些逃逸分析规则不需要掌握,我们只需通过go build -gcflags '-m'命令来观察变量逃逸情况就行了。
      • 不要盲目使用变量的指针作为函数参数,虽然它会减少复制操作。但其实当参数为变量自身的时候,复制是在栈上完成的操作,开销远比变量逃逸后动态地在堆上分配内存少的多。
      • 最后,尽量写出少一些逃逸的代码,提升程序的运行效率。
    • 包管理
      学go mod就够了!

    • 优化

    • 并发编程

    • 高级特性

    • 问题排查

    • 源码阅读

    • 汇编

    • 推荐书籍

    • 视频教程

    • 实践常用工具

  • 图解网络基础

  • 骚话连篇



  • 其他
  1. 常用包
常用包 说明
fmt 实现格式化的输入输出操作,其中的fmt.Printf()和fmt.Println()是开发者使用最为频繁的函数。
io 实现了一系列非平台相关的IO相关接口和实现,比如提供了对os中系统相关的IO功能的封装。我们在进行流式读写(比如读写文件)时,通常会用到该包。
bufio 它在io的基础上提供了缓存功能。在具备了缓存功能后, bufio可以比较方便地提供ReadLine之类的操作。
strconv 提供字符串与基本数据类型互转的能力。
os 本包提供了对操作系统功能的非平台相关访问接口。接口为Unix风格。提供的功能包括文件操作、进程管理、信号和用户账号等。
sync 它提供了基本的同步原语。在多个goroutine访问共享资源的时候,需要使用sync中提供的锁机制。
flag 它提供命令行参数的规则定义和传入参数解析的功能。绝大部分的命令行程序都需要用到这个包。
encoding/json JSON目前广泛用做网络程序中的通信格式。本包提供了对JSON的基本支持,比如从一个对象序列化为JSON字符串,或者从JSON字符串反序列化出一个具体的对象等。
http 通过http包,只需要数行代码,即可实现一个爬虫或者一个Web服务器,这在传统语言中是无法想象的。



2. 常用第三方包

地址
数据库操作 github.com/jinzhu/gorm
github.com/go-xorm/xorm
搜索es github.com/olivere/elastic
rocketmq操作 github.com/apache/rocketmq-client-go/v2
rabbitmq 操作 github.com/streadway/amqp
redis 操作 github.com/go-redis/redis
etcd 操作 github.com/coreos/etcd/clientv3
kafka https://github.com/Shopify/sarama https://github.com/bsm/sarama-cluster
excel 操作 github.com/360EntSecGroup-Skylar/excelize
ppt 操作 golang.org/x/tools/cmd/present
go-svg 操作 https://github.com/ajstarks/svgo
go 布隆过滤器实现 https://github.com/AndreasBriese/bbloom
json相关 https://github.com/bitly/go-simplejson
LRU Cache实现 https://github.com/bluele/gcache https://github.com/hashicorp/golang-lru
go运行时函数替换 https://github.com/bouk/monkey
toml https://github.com/toml-lang/toml https://github.com/naoina/toml
yaml https://github.com/go-yaml/yaml
viper https://github.com/spf13/viper
go key/value存储 https://github.com/etcd-io/bbolt
基于ringbuffer的无锁golang workpool https://github.com/Dai0522/workpool
轻量级的协程池 https://github.com/ivpusic/grpool
打印go的详细数据结构 https://github.com/davecgh/go-spew
基于ringbuffer实现的队列 https://github.com/eapache/queue
拼音 https://github.com/go-ego/gpy
分词 https://github.com/go-ego/gse
搜索 https://github.com/go-ego/riot
windows COM https://github.com/go-ego/cedar
session https://github.com/gorilla/sessions
路由 https://github.com/gorilla/mux
websocket https://github.com/gorilla/websocket
Action handler https://github.com/gorilla/handlers
csrf https://github.com/gorilla/csrf
context https://github.com/gorilla/context
过滤html标签 https://github.com/grokify/html-strip-tags-go
可配置的HTML标签过滤 https://github.com/microcosm-cc/bluemonday
根据IP获取地理位置信息 https://github.com/ipipdotnet/ipdb-go
html转markdown https://github.com/jaytaylor/html2text
goroutine 本地存储 https://github.com/jtolds/gls
彩色输出 https://github.com/mgutz/ansi
表格打印 https://github.com/olekukonko/tablewriter
reflect 更高效的反射API https://github.com/modern-go/reflect2
msgfmt (格式化字符串,将%更换为变量名) https://github.com/modern-go/msgfmt
可取消的goroutine https://github.com/modern-go/concurrent
深度拷贝 https://github.com/mohae/deepcopy
安全的类型转换包 https://github.com/spf13/cast
从文本中提取链接 https://github.com/mvdan/xurls
字符串格式处理(驼峰转换) https://godoc.org/github.com/naoina/go-stringutil
文本diff实现 https://github.com/pmezard/go-difflib
uuid相关 https://github.com/satori/go.uuid https://github.com/snluu/uuid
去除UTF编码中的BOM https://github.com/ssor/bom
图片缩放 https://github.com/nfnt/resize
生成 mock server https://github.com/otokaze/mock
go 性能上报到influxdb https://github.com/rcrowley/go-metrics
go zookeeper客户端 https://github.com/samuel/go-zookeeper
go thrift https://github.com/samuel/go-thrift
MQTT 客户端 https://github.com/shirou/mqttcli
hbase https://github.com/tsuna/gohbase
go 性能上报到influxdb https://github.com/rcrowley/go-metrics
go 性能上报到prometheus https://github.com/deathowl/go-metrics-prometheus
ps utils https://github.com/shirou/gopsutil
小数处理 https://github.com/shopspring/decimal
结构化日志处理(json) https://github.com/sirupsen/logrus
命令行程序框架 cli https://github.com/urfave/cli
命令行程序框架 cobra https://github.com/spf13/cobra



3. 必看项目

项目 地址 说明
gin github.com/gin-gonic/gin 轻量级web框架,很多公司都是基于它进行魔改
beego github.com/beego/beego 也是web框架,比较全能
kratos github.com/go-kratos/kratos bilibili开源的微服务框架,b站出品必属于精品
TiDB github.com/pingcap/tidb 见识过mysql性能瓶颈之后你会想要选择的一款数据库



4. 完整标准库列表

子包 说明
bufio bytes 提供了对字节切片操作的函数
crypto 收集了常见的加密常数
errors 实现了操作错误的函数
Expvar 为公共变量提供了一个标准的接口,如服务器中的运算计数器
flag 实现了命令行标记解析
fmt 实现了格式化输入输出
hash 提供了哈希函数接口
html 实现了一个HTML5兼容的分词器和解析器
image 实现了一个基本的二维图像库
io 提供了对I/O原语的基本接口
log 它是一个简单的记录包,提供最基本的日志功能
math 提供了一些基本的常量和数学函数
mine 实现了部分的MIME规范
net 提供了一个对UNIX网络套接字的可移植接口,包括TCP/IP、 UDP域名解析和UNIX域套接字
os 为操作系统功能实现了一个平台无关的接口
path 实现了对斜线分割的文件名路径的操作
reflect 实现了运行时反射,允许一个程序以任意类型操作对象
regexp 实现了一个简单的正则表达式库
runtime 包含与Go运行时系统交互的操作,如控制goroutine的函数
sort 提供对集合排序的基础函数集
strconv 实现了在基本数据类型和字符串之间的转换
strings 实现了操作字符串的简单函数
sync 提供了基本的同步机制,如互斥锁
syscall 包含一个低级的操作系统原语的接口
testing 提供对自动测试Go包的支持
time 提供测量和显示时间的功能
unicode Unicode编码相关的基础函数
archive tar 实现对tar压缩文档的访问
zip 提供对ZIP压缩文档的读和写支持
compress bzip2 实现了bzip2解压缩
flate 实现了RFC 1951中所定义的DEFLATE压缩数据格式
gzip 实现了RFC 1951中所定义的gzip格式压缩文件的读和写
lzw 实现了 Lempel-Ziv-Welch编码格式的压缩的数据格式
zlib 实现了RFC 1950中所定义的zlib格式压缩数据的读和写
container heap 提供了实现heap.Interface接口的任何类型的堆操作
lsit 实现了一个双链表
ring 实现了对循环链表的操作
crypto aes 实现了AES加密(以前的Rijndael)
cipher 实现了标准的密码块模式,该模式可包装进低级的块加密实现中
des 实现了数据加密标准( Data Encryption Standard,DES)和三重数据加密算法( TripleData Encryption Algorithm, TDEA)
dsa 实现了FIPS 186-3所定义的数据签名算法( Digital Signature Algorithm)
ecdsa 实现了FIPS 186-3所定义的椭圆曲线数据签名算法( Elliptic Curve Digital SignatureAlgorithm)
elliptic 实现了素数域上几个标准的椭圆曲线
hmac 实现了键控哈希消息身份验证码( Keyed-Hash Message Authentication Code,HMAC)
md5 实现了RFC 1321中所定义的MD5哈希算法
rand 实现了一个加密安全的伪随机数生成器
rc4 实现了RC4加密,其定义见Bruce Schneier的应用密码学( Applied Cryptography)
rsa 实现了PKCS#1中所定义的RSA加密
sha1 实现了RFC 3174中所定义的SHA1哈希算法
sha256 实现了FIPS 180-2中所定义的SHA224和SHA256哈希算法
sha512 实现了FIPS 180-2中所定义的SHA384和SHA512哈希算法
subtle 实现了一些有用的加密函数,但需要仔细考虑以便正确应用它们
tls 部分实现了RFC 4346所定义的TLS 1.1协议
x509 可解析X.509编码的键值和证书
x509/pkix 包含用于对X.509证书、 CRL和OCSP的ASN.1解析和序列化的共享的、低级的结构
database sql 围绕SQL提供了一个通用的接口
sql/driver 定义了数据库驱动所需实现的接口,同sql包的使用方式
debug dwarf 提供了对从可执行文件加载的DWARF调试信息的访问,这个包对于实现Go语言的调试器非常有价值
elf 实现了对ELF对象文件的访问。 ELF是一种常见的二进制可执行文件和共享库的文件格式。 Linux采用了ELF格式
gosym 访问Go语言二进制程序中的调试信息。对于可视化调试很有价值
macho 实现了对Mach-O对象文件的访问
pe 实现了对PE( Microsoft Windows Portable Executable)文件的访问
encoding ascii85 实现了ascii85数据编码,用于btoa工具和Adobe’s PostScript以及PDF文档格式
asn1 实现了解析DER编码的ASN.1数据结构,其定义见ITU-T Rec X.690
base32 实现了RFC 4648中所定义的base32编码
base64 实现了RFC 4648中所定义的base64编码
binary 实现了在无符号整数值和字节串之间的转化,以及对固定尺寸值的读和写
csv 可读和写由逗号分割的数值( csv)文件
gob 管理gob流——在编码器(发送者)和解码器(接收者)之间进行二进制值交换
hex 实现了十六进制的编码和解码
json 实现了定义于RFC 4627中的JSON对象的编码和解码
pem 实现了PEM( Privacy Enhanced Mail)数据编码
xml 实现了一个简单的可理解XML名字空间的XML 1.0解析器
go ast 声明了用于展示Go包中的语法树类型
build 提供了构建Go包的工具
doc 从一个Go AST(抽象语法树)中提取源代码文档
parser 实现了一个Go源文件解析器
printer 实现了对AST(抽象语法树)的打印
scanner 实现了一个Go源代码文本的扫描器
token 定义了代表Go编程语言中词法标记以及基本操作标记( printing、 predicates)的常量
hash adler32 实现了Adler-32校验和
crc32 实现了32位的循环冗余校验或CRC-32校验和
crc64 实现了64位的循环冗余校验或CRC-64校验和
fnv 实现了Glenn Fowler、 Landon Curt Noll和Phong Vo所创建的FNV-1和FNV-1a未加密哈希函数
html template 它自动构建HTML输出,并可防止代码注入
image color 实现了一个基本的颜色库
draw 提供一些做图函数
gif 实现了一个GIF图像解码器
jpeg 实现了一个JPEG图像解码器和编码器
png 实现了一个PNG图像解码器和编码器
index suffixarray 通过构建内存索引实现的高速字符串匹配查找算法
io ioutil 实现了一些实用的I/O函数
log syslog 提供了对系统日志服务的简单接口
math big 实现了多精度的算术运算(大数)
cmplx 为复数提供了基本的常量和数学函数
rand 实现了伪随机数生成器
mime multipart 实现了在RFC 2046中定义的MIME多个部分的解析
net http 提供了HTTP客户端和服务器的实现
mail 实现了对邮件消息的解析
rpc 提供了对一个来自网络或其他I/O连接的对象可导出的方法的访问
smtp 实现了定义于RFC 5321中的简单邮件传输协议( Simple Mail Transfer Protocol)
textproto 实现了在HTTP、 NNTP和SMTP中基于文本的通用的请求/响应协议
url 解析URL并实现查询转义
http/cgi 实现了定义于RFC 3875中的CGI(通用网关接口)
http/fcgi 实现了FastCGI协议
http/httptest 提供了一些HTTP测试应用
http/httputil 提供了一些HTTP应用函数,这些是对net/http包中的东西的补充,只不过相对不太常用
http/pprof 通过其HTTP服务器运行时提供性能测试数据,该数据的格式正是pprof可视化工具需要的
rpc/jsonrpc 为rpc包实现了一个JSON-RPC ClientCodec和ServerCodec
os exec 可运行外部命令
user 通过名称和id进行用户账户检查
path filepath 实现了以与目标操作系统定义文件路径相兼容的方式处理文件名路径
regexp syntax 将正则表达式解析为语法树
runtime debug 包含当程序在运行时调试其自身的功能
pprof 以pprof可视化工具需要的格式写运行时性能测试数据
sync atomic 提供了低级的用于实现同步算法的原子级的内存机制
testing iotest 提供一系列测试目的的类型,实现了Reader和Writer标准接口
quick 实现了用于黑箱测试的实用函数
script 帮助测试使用通道的代码
text scanner 为UTF-8文本提供了一个扫描器和分词器
tabwriter 实现了一个写筛选器( tabwriter.Writer),它可将一个输入的tab分割的列翻译为适当对齐的文本
template 数据驱动的模板引擎,用于生成类似HTML的文本输出格式
template/parse 为template构建解析树
unicode/utf16 实现了UTF-16序列的的编码和解码
unicode/utf8 实现了支持以UTF-8编码的文本的函数和常数



5. 其他优秀的开源工具分类

  • 音频和音乐
说明
EasyMIDI EasyMidi是一个简单可靠的库,用于处理标准Midi文件(SMF)。
flac 支持FLAC流的Native Go FLAC编码器/解码器。
gaad 本机Go AAC比特流解析器。
go-sox 用于go的libsox绑定。
go_mediainfo 用于go的libmediainfo绑定。
gosamplerate 用于go的libsamplerate绑定。
id3v2 用于Go的快速,稳定的ID3解析和编写库。
malgo 迷你音频库。
minimp3 轻量级MP3解码器库。
mix 为音乐应用程序基于序列转到本地音频混合器。
mp3 Native Go MP3解码器。
music-theory Go中的音乐理论模型。
Oto 在多个平台上播放声音的低级库。
PortAudio 用于PortAudio音频I / O库的绑定。
portmidi 绑定PortMidi。
taglib 为taglib绑定。
vorbis “本机” Go Vorbis解码器(使用CGO,但没有依赖项)。
waveform Go程序包,能够从音频流生成波形图像。
  • 数据结构
说明
algorithms 算法和数据结构。CLRS研究。
binpacker 二进制打包程序和解包程序可帮助用户构建自定义二进制流。
bit 具有额外的位旋转功能的Golang设置数据结构。
bitset 实现位集的Go包。
bloom 在Go中实现的Bloom过滤器。
bloom Golang Bloom过滤器实现。
boomfilters 用于处理连续无界流的概率数据结构。
concurrent-writer 高并发直接替换bufio.Writer。
conjungo 一个小型,强大而灵活的合并库。
count-min-log 执行Count-Min-Log草图:使用近似计数器进行近似计数(类似于Count-Min草图,但使用较少的内存)。
crunch Go包实现了用于轻松处理各种数据类型的缓冲区。
cuckoofilter Cuckoo过滤器:是Go中实现的计数布隆过滤器的很好替代。
deque 高度优化的双端队列。
deque 快速的环形缓冲区双端队列(双端队列)。
dict Go的类似Python的字典(dict)。
encoding Go的整数压缩库。
go-adaptive-radix-tree 自适应基数树的 Go实现。
go-datastructures 有用,高性能和线程安全的数据结构的集合。
go-ef Elias-Fano编码的Go实现。
go-geoindex 内存中的地理索引。
go-mcache 快速内存键:值存储/缓存库。指针缓存。
go-rquad 具有有效点定位和邻居发现功能的区域四叉树。
gocache 具有多个存储(内存,memcache,redis等),可链接,可加载,指标缓存等的完整Go缓存库。
goconcurrentqueue 并发FIFO队列。
gods 数据结构。容器,集合,列表,堆栈,地图,BidiMap,树,HashSet等。
gofal Go的小数api。
golang-set Go的线程安全和非线程安全高性能集。
goset Go的有用的Set集合实现。
goskiplist Go中的跳过列表实现。
gota Go的数据框,序列和数据整理方法的实现。
hide ID类型,将其编组进/出哈希以防止将ID发送给客户端。
hilbert Go程序包,用于在空间填充曲线(例如Hilbert和Peano曲线)之间映射值。
hyperloglog HyperLogLog实施,具有稀疏,LogLog-Beta偏差校正和TailCut空间减少功能。
iter C ++ STL迭代器和算法的实现。
levenshtein Levenshtein距离和相似性度量标准,具有可自定义的编辑费用和通用前缀的类似于Winkler的奖金。
levenshtein 在Go中计算levenshtein距离的实现。
mafsa 具有最小完美散列的MA-FSA实现。
merkletree merkle树的实现,可对数据结构的内容进行有效且安全的验证。
mspm 用于信息检索的多字符串模式匹配算法。
null 可空转到类型,可以被编组/解组到/从JSON。
parsefields 用于解析类似JSON的日志的工具,以收集唯一的字段和事件。
pipeline 具有扇入和扇出的管线的实现。
ptrie 前缀树的实现。
remember-go 缓存慢速数据库查询的通用接口(由redis,memcached,ristretto或内存支持)。
ring 围棋实现了高性能,线程安全的布隆过滤器。
roaring 实施压缩位集的软件包。
set 使用LinkedHashMap的围棋设置简单的数据结构实现。
skiplist 非常快的Go Skiplist实施。
skiplist Go中的跳过列表实现。
timedmap 具有过期的键/值对的地图。
treap 使用树堆的持久快速排序的地图。
trie Go中的Trie实现。
ttlcache 内存中的LRU字符串接口{}映射,其中包含golang的到期时间。
typ 空类型,安全的原始类型转换和从复杂结构中获取值。
willf/bloom Go包实现Bloom过滤器。
  • 分布式系统
说明
celeriac 用于在Go中添加支持以交互和监视Celery工作者,任务和事件的库。
consistent 具有受限负载的一致哈希
dht BitTorrent Kademlia DHT实施。
digota grpc电子商务微服务。
dot 使用操作转换/ OT进行分布式同步。
doublejump 改进后的Google的跳转一致性哈希。
dragonboat Go中功能齐全的高性能多组Raft库。
drmaa 基于DRMAA标准的集群调度程序的作业提交库。
dynamolock DynamoDB支持的分布式锁定实现。
dynatomic 将DynamoDB用作原子计数器的库。
emitter-io 使用MQTT,Websockets和love构建的高性能,分布式,安全和低延迟的发布-订阅平台。
flowgraph 基于流的编程包。
gleam 用纯围棋和Luajit快速和可扩展的分布式的map / reduce系统,具有Luajit的高性能结合Go的高并发,单独运行或分发。
glow 易于使用的可扩展的分布式大数据处理,Map-Reduce,DAG执行,全部在纯Go中进行。
go-health health-用于在服务中启用异步依赖项运行状况检查的库。
go-jump Google的“ Jump”一致性哈希函数的端口。
go-kit 支持服务发现,负载平衡,可插拔传输,请求跟踪等的微服务工具包
go-sundheit 建立用于支持为golang服务定义异步服务运行状况检查的库。
gorpc 简单,快速和可扩展的RPC库,可实现高负载。
grpc-go gRPC的Go语言实现。基于HTTP / 2的RPC。
hprose 十分新颖的RPC库,现在支持25种以上的语言。
jsonrpc jsonrpc软件包可帮助实现JSON-RPC 2.0。
jsonrpc JSON-RPC 2.0 HTTP客户端实现。
KrakenD 具有中间件的超高性能API网关框架。
liftbridge NATS的轻量级,容错消息流。
micro 可插拔的microService工具箱和分布式系统平台。
NATS 用于微服务,IoT和云本机系统的轻量级高性能消息传递系统。
outboxer Outboxer是一个实现库模式的go库。
pglock PostgreSQL支持的分布式锁定实现。
raft HashiCorp的Raft共识协议的Golang实现。
raft ETCD中实现的Raft协议。
rain BitTorrent客户端和库。
redis-lock 使用Redis的简化分布式锁定实现。
resgate 用于构建REST,实时和RPC API的实时API网关,其中所有客户端都可以无缝同步。
ringpop-go Go应用程序的可扩展,容错应用程序层分片。
rpcx 分布式可插拔RPC服务框架,例如阿里巴巴Dubbo。
sleuth 用于在HTTP服务之间进行无主p2p自动发现和RPC的库(ZeroMQ)。
tendermint 高性能中间件,用于使用Tendermint共识和区块链协议将以任何编程语言编写的状态机转换为拜占庭容错复制状态机。
torrent BitTorrent客户端软件包。
  • 电子邮件
说明
chasquid 用Go编写的SMTP服务器。
douceur CSS内衬为您的HTML电子邮件。
email 用于Go的强大而灵活的电子邮件库。
go-dkim DKIM库,用于签名和验证电子邮件。
go-imap 用于客户端和服务器的IMAP库。
go-message Internet消息格式和邮件消息的流库。
go-premailer Go中HTML邮件的内联样式。
go-simple-mail 使用SMTP保持活动状态和两个超时发送电子邮件的非常简单的程序包:连接和发送。
Hectane 提供HTTP API的轻型SMTP客户端。
hermes Golang软件包,可生成干净的响应式HTML电子邮件。
mailchain 将加密的电子邮件发送到用Go编写的区块链地址。
mailgun-go Go库,用于使用Mailgun API发送邮件。
MailHog 通过Web和API界面进行电子邮件和SMTP测试。
SendGrid SendGrid的Go库,用于发送电子邮件。
smtp SMTP服务器协议状态机。
  • 嵌入式脚本语言
说明
anko 用Go语言编写的可编写脚本的解释器。
binder 转到基于gopher-lua的 Lua绑定库。
cel-go 具有渐进式输入功能的快速,便携式,非图灵完整表达评估。
expr 可以评估表达式的引擎。
gentee 可嵌入的脚本编程语言。
gisp Go中的简单LISP。
go-duktape Go的Duktape JavaScript引擎绑定。
go-lua Lua 5.2 VM到纯Go的端口。
go-php Go的PHP绑定。
go-python 与CPython C-API的幼稚go绑定。
golua Lua C API的绑定。
gopher-lua 用Go编写的Lua 5.1 VM和编译器。
gval 用Go编写的高度可定制的表达语言。
ngaro 可嵌入的Ngaro VM实现,支持在Retro中编写脚本。
otto 用Go编写的JavaScript解释器。
purl Go中嵌入的Perl 5.18.2。
tengo 用于Go的字节码编译脚本语言。
  • 错误处理
说明
emperror Go库和应用程序的错误处理工具和最佳实践。
errlog 可破解的软件包,用于确定错误的负责任的源代码(以及其他一些快速调试功能)。可插入任何现成的记录器。
errors 下拉更换为标准库的错误包和github.com/pkg/errors。提供各种错误处理原语。
errors 提供简单错误处理原语的软件包。
errors 简单golang错误处理与分类元。
errorx 具有堆栈跟踪,错误组成等的功能丰富的错误包。
Falcon 一个简单但功能强大的错误处理软件包。
go-multierror Go(golang)软件包,用于将错误列表表示为单个错误。
tracerr 带有堆栈跟踪和源代码片段的Golang错误。
werr 错误包装程序为Go中的错误类型创建了一个包装程序,该包装程序捕获了调用它的文件,行和堆栈。
  • 文件
说明
afero Go的文件系统抽象系统。
afs Go的抽象文件存储(mem,scp,zip,tar,云:s3,gs)。
bigfile 文件传输系统,支持使用http api,rpc调用和ftp客户端管理文件。
checksum 计算大型文件的消息摘要,例如MD5和SHA256。
flop 文件操作库,旨在与GNU cp镜像功能奇偶校验。
go-csv-tag tag-使用标签加载csv文件。
go-decent-copy 复制human文件。
go-exiftool ExifTool的Go绑定,这是众所周知的库,用于从文件(图片,PDF,office,...)提取尽可能多的元数据(EXIF,IPTC等)。
go-gtfs 在go中加载gtfs文件。
notify 具有简单API的文件系统事件通知库,类似于os / signal。
opc 为Go加载Open Packaging Conventions(OPC)文件。
parquet 读取和写入 parquet文件。
pdfcpu PDF 处理器。
skywalker 一种软件包,允许一个人轻松地同时通过文件系统。
stl 读取和写入STL(立体光刻)文件的模块。并发读取算法。
tarfs tar文件FileSystem interface接口的实现。
vfs 跨多种文件系统类型(例如os,S3和GCS)的Go的一组可插拔,可扩展且自以为是的文件系统功能。
  • 金融
说明
accounting golang的货币和货币格式。
currency 高性能和准确的货币计算包。
decimal 任意精度定点十进制数字。
go-finance Go中的综合金融市场数据。
go-finance 金融功能库,用于货币时间价值(年金),现金流量,利率转换,债券和折旧计算。
go-finance 获取汇率,通过VIES检查增值税号和检查IBAN银行帐号的模块。
go-money Fowler的Money模式的实现。
ofxgo 查询OFX服务器和/或解析响应(使用示例命令行客户端)。
orderbook 匹配引擎的限价订单在Golang。
techan 具有高级市场分析和交易策略的技术分析库。
transaction 以多线程模式运行的嵌入式帐户嵌入式事务数据库。
vat 增值税号验证和欧盟增值税率。
  • 游戏开发
说明
Azul3D 用Go语言编写的3D游戏引擎。
Ebiten Go中死的简单2D游戏库。
engo Engo是用Go语言编写的开源2D游戏引擎。它遵循实体组件系统范式。
g3n Go 3D游戏引擎。
GarageEngine 用Go语言编写的2D游戏引擎,可在OpenGL上使用。
glop Glop(权力游戏库)是一个相当简单的跨平台游戏库。
go-astar A 路径查找算法的Go实现。
go-collada Go包,用于Collada文件格式。
go-sdl2 Simple DirectMedia Layer的 Go绑定。
go3d 用于Go的面向性能的2D/3D数学软件包。
gonet 使用golang实现的游戏服务器框架。
goworld 可扩展的游戏服务器引擎,具有空间实体框架和热插拔功能。
Leaf 轻量级游戏服务器框架。
nano 重量轻,设备,高性能的基于golang游戏服务器架构。
Oak Pure Go游戏引擎。
Pitaya 可扩展的游戏服务器框架,具有群集支持和通过C SDK的iOS,Android,Unity等客户端库。
Pixel Go中的手工制作2D游戏库。
raylib-go 去绑定raylib,简单和易于使用的库,以了解电子游戏编程。
termloop Go的基于终端的游戏引擎,建立在Termbox之上。
  • 地理位置
说明
geocache 适用于基于地理位置的应用程序的内存中缓存。
geoserver geoserver是Go软件包,用于通过GeoServer REST API操纵GeoServer实例。
gismanager 将 GIS数据(矢量数据)发布到PostGIS和Geoserver。
osm 用于读取,编写和使用OpenStreetMap数据和API的库。
pbf OpenStreetMap PBF golang编码器/解码器。
S2 geometry Go中的S2几何库。
Tile38 具有空间索引和实时地理围栏的地理位置数据库。
WGS84 库坐标转换和变换(ETRS89,OSGB36,NAD83,RGF93,网络墨卡托UTM)。
  • 编译器
说明
c4go 将C代码转换为Go代码。
f4go 将FORTRAN 77代码转换为Go代码。
gopherjs 从Go到JavaScript的编译器。
llgo Go的基于LLVM的编译器。
tardisgo Golang转换为CPP / CSharp / Java / JavaScript转译器。
  • Goroutines
说明
ants 用于golang的高性能goroutine池。
artifex Golang使用基于工作程序的分派的简单内存中作业队列。
async 一种异步执行功能的安全方法,以防万一。
breaker 使执行流程可中断的灵活机制。
cyclicbarrier 用于golang的CyclicBarrier。
go-floc 轻松编排goroutine。
go-flow 控制goroutine的执行顺序。
go-tools/multithreading 使用带有简单API的轻量级库管理goroutine池。
go-trylock 支持Golang的读写锁的TryLock。
go-waitgroup sync.WaitGroup与错误处理和并发控制类似。
gohive Go的高性能和易于使用的Goroutine池。
gollback 异步简单函数实用程序,用于管理闭包和回调的执行。
GoSlaves 简单和异步Goroutine池库。
goworker goworker是基于Go的后台工作者。
gowp gowp是并发限制goroutine池。
gpool 管理可调整大小的上下文感知goroutine池以绑定并发。
grpool 轻巧的Goroutine池。
Hunch 预感提供功能,如:All,First,Retry,Waterfall等等,这使得异步流控制更加直观。
oversight 监督是Erlang监督树的完整实现。
parallel-fn 并行运行功能。
pool 有限的消费者goroutine池或无限制的goroutine池,以便更轻松地处理和取消goroutine。
queue 为您提供sync.WaitGroup类似的队列组可访问性。帮助您节流和限制goroutine,等待所有goroutine结束等等。
routine 具有上下文和支持的例程控制:Main,Go,Pool和一些有用的Executors。
semaphore 基于通道和上下文的具有锁定/解锁操作超时的信号量模式实现。
semaphore 基于CAS的快速可调整大小的信号量实现(比基于通道的信号量实现更快)。
stl 基于软件交易内存(STM)并发控制机制的软件交易锁。
threadpool Golang线程池实现。
tunny 线程池golang。
worker-pool goworker是一个简单的Go异步工作池。
workerpool Goroutine池,它限制了任务执行的并发性,而不是排队的任务数。
  • 图形界面
说明
app 打包以使用GO,HTML和CSS创建应用的程序。支持:MacOS,Windows正在开发中。
fyne 为Go设计的跨平台本机GUI,使用EFL呈现。支持:Linux,macOS,Windows。
go-astilectron 使用GO和HTML / JS / CSS(由Electron支持)构建跨平台GUI应用。
go-gtk GTK的绑定。
go-sciter Go绑定:用于现代桌面UI开发的可嵌入HTML / CSS / script引擎。跨平台。
gotk3 GTK3的绑定。
gowd 使用GO,HTML,CSS和NW.js进行快速简单的桌面UI开发。跨平台。
qt Go的Qt绑定(支持Windows / macOS / Linux / Android / iOS / Sailfish OS / Raspberry Pi)。
ui Go的平台本地GUI库。跨平台。
Wails 使用内置OS HTML渲染器的HTML UI的Mac,Windows,Linux桌面应用程序。
walk Go的Windows应用程序库工具包。
webview 具有简单双向JavaScript绑定的跨平台Webview窗口(Windows / macOS / Linux)。
go-appindicator libappindicator3 C库的Go绑定。
gosx-notifier Go的OSX桌面通知库。
mac-activity-tracker OSX库,用于通知计算机上的任何(可插入)活动。
mac-sleep-notifier golang中的OSX睡眠/唤醒通知。
robotgo Go本机跨平台GUI系统自动化。控制鼠标,键盘等。
systray 跨平台的Go库,用于在通知区域中放置图标和菜单。
trayhost 跨平台的Go库,用于在主机操作系统的任务栏中放置一个图标。
  • 图片
说明
bild 纯Go中图像处理算法的集合。
bimg 使用libvips进行快速有效的图像处理的小包装。
cameron Go的头像生成器。
canvas 将矢量图形转换为PDF,SVG或光栅图像。
darkroom 具有可变存储后端的图像代理和侧重于速度和弹性的图像处理引擎。
geopattern 从字符串创建漂亮的生成图像图案。
gg 纯Go中的2D渲染。
gift 图像处理过滤器的包装。
gltf 高效,强大的glTF 2.0读取器,写入器和验证器。
go-cairo 用于cairo图形库的绑定。
go-gd GD库的Go绑定。
go-nude Go的裸露检测。
go-opencv 用于OpenCV的绑定。
go-webcolors webcolors库的端口,从Python到Go。
gocv 使用OpenCV 3.3+进行计算机视觉的Go软件包。
goimagehash Go感知图像哈希包。
goimghdr imghdr模块确定Go文件中包含的图像类型。
govatar 用于生成有趣头像的库和CMD工具。
image2ascii 将图像转换为ASCII。
imagick 绑定到ImageMagick的MagickWand C API。
imaginary 用于图像大小调整的快速,简单的HTTP微服务。
imaging 简单的Go图像处理包。
img 选择图像处理工具。
ln Go中的3D线条艺术渲染。
mergi 用于图像处理(合并,裁切,调整大小,水印,动画)的Tool&Go库。
mort 用Go编写的存储和图像处理服务器。
mpo 用于MPO 3D照片的解码器和转换工具。
picfit 用Go编写的图像大小调整服务器。
pt 用Go语言编写的路径跟踪引擎。
resize 使用常见的插值方法为Go 调整图像大小。
rez 在纯Go和SIMD中调整图像大小。
smartcrop 查找适合任何图像和尺寸的优质作物。
steganography 用于LSB隐写术的Pure Go库。
stegify 用于LSB隐写术的Go工具,能够隐藏图像中的任何文件。
svgo 用于SVG生成的Go语言库。
tga 软件包tga是TARGA图像格式的解码器/编码器。
  • 物联网
说明
connectordb 量化自我和物联网的开源平台。
devices IoT设备库套件,针对x / exp / io进行实验。
eywa Project Eywa本质上是一个连接管理器,用于跟踪连接的设备。
flogo Project Flogo是一个用于IoT Edge应用和集成的开源框架。
gatt 盖特是一个围棋包构建低功耗蓝牙外设。
gobot Gobot是机器人技术,物理计算和物联网的框架。
huego 适用于Go的飞利浦Hue扩展客户端库。
iot IoT是用于实现Google IoT Core设备的简单框架。
mainflux 工业物联网消息和设备管理服务器。
periph 外设I / O与低级别的主板设备接口。
sensorbee 用于物联网的轻量级流处理引擎。
  • JSON格式
说明
ajson 具有JSONPath支持的golang的抽象JSON。
gjo 用于创建JSON对象的小型实用程序。
GJSON 使用一行代码获取JSON值。
go-jsonerror Go-JsonError可让我们轻松创建遵循JsonApi规范的json响应错误。
go-respond Go包,用于处理常见的HTTP JSON响应。
gojq Golang中的 JSON查询。
gojson 从示例JSON自动生成Go(golang)结构定义。
JayDiff 用Go编写的JSON diff实用程序。
jettison 用于Go的高性能,无反射JSON编码器。
JSON-to-Go 将JSON转换为Go结构。
json2go 高级JSON到Go结构转换。提供可以解析多个JSON文档并创建适合所有JSON的结构的包。
jsonapi-errors 根据JSON API错误参考进行绑定。
jsonf 突出显示格式和获取JSON的结构查询的控制台工具。
jsongo Fluent API,可以更轻松地创建Json对象。
jsonhal 简单的Go包,用于将自定义结构编组为HAL兼容的JSON响应。
kazaam 用于JSON文档的任意转换的API。
mp 简单的cli电子邮件解析器。当前,它使用标准输入并输出JSON。
  • 机器学习
说明
bayesian 贝叶斯分类为Golang天真。
CloudForest 快速,灵活,多线程的决策树集合,用于纯Go中的机器学习。
eaopt 进化优化库。
evoli 遗传算法和粒子群优化库。
fonet 用Go编写的深度神经网络库。
go-cluster k模式和k-原型聚类算法的Go实现。
go-deep Go中功能丰富的神经网络库
go-fann 快速人工神经网络(FANN)库的Go绑定。
go-galib 用Go / golang编写的遗传算法库。
go-pr Go lang中的模式识别包。
gobrain 用go语言编写的神经网络
godist 各种概率分布及相关方法。
goga Go的遗传算法库。
GoLearn 用于Go的通用机器学习库。
golinear Go的liblinear绑定。
GoMind Go中的简单神经网络库。
goml Go中的在线机器学习。
Goptuna 用于Go语言编写的黑盒函数的贝叶斯优化框架。一切都会被优化。
goRecommend 用Go编写的推荐算法库。
gorgonia 基于图形的计算库,例如Theano for Go,它提供了用于构建各种机器学习和神经网络算法的原语。
gorse 基于Go编写的协作过滤的离线推荐系统后端。
goscore 用于PMML的Go Scoring API。
gosseract 使用Tesseract C ++库的OCR(光学字符识别)软件包。
libsvm 基于LIBSVM 3.14 libsvm的golang版本衍生作品。
neat 用于增强拓扑神经演化(NEAT)的即插即用,并行Go框架。
neural-go go-在Go中实现的多层感知器网络,通过反向传播进行训练。
ocrserver 一个简单的OCR API服务器,非常容易被Docker和Heroku部署。
onnx-go 转到开放神经网络交换(ONNX)的接口。
probab 概率分布函数。贝叶斯推断。用纯Go语言编写。
regommend 建议和协作过滤引擎。
shield 贝叶斯文本分类器,具有灵活的标记器和Go的存储后端。
tfgo 易于使用的Tensorflow绑定:简化了官方Tensorflow Go绑定的使用。在Go中定义计算图,加载并执行经过Python训练的模型。
Varis Golang神经网络。
  • 金融
说明
unioffice Pure Go库,用于创建和处理Office Word(.docx),Excel(.xlsx)和Powerpoint(.pptx)文档。
excelize Golang库用于读取和写入Microsoft Excel™(XLSX)文件。
go-excel 一个简单而轻便的阅读器,可以将类似于related-db的excel读取为表格。
goxlsxwriter libxlsxwriter的Golang绑定,用于编写XLSX(Microsoft Excel)文件。
xlsx 用于简化在Go程序中读取Microsoft Excel最新版本使用的XML格式的库。
xlsx 在Go程序中快速/安全地读取/更新您现有的Microsoft Excel文件的方法。
  • 自然语言处理
说明
getlang 快速自然语言检测程序包。
go-i18n 用于处理本地化文本的软件包和一个随附工具。
go-mystem CGo与Yandex.Mystem的绑定-俄罗斯形态分析仪。
go-nlp 用于处理离散概率分布的实用程序和其他可用于执行NLP工作的工具。
go-pinyin CN Hanzi至Hanyu拼音转换器。
go-stem 搬运程序阻止算法的实现。
go-unidecode Unicode文本的ASCII音译。
go2vec 用于word2vec嵌入的阅读器和实用程序功能。
gojieba 这是一个围棋实施解霸其中中国分词算法。
golibstemmer 雪球库libstemmer库的绑定,包括porter 2。
gotokenizer 基于字典和Goram语言的Bigram语言模型的标记器。(现在仅支持中文细分)
gounidecode Go的Unicode音译器(也称为unidecode)。
gse 进行有效的文本分割;支持英语,中文,日语等。
icu CGO结合为ICU4C C库检测和转换功能。保证与版本50.1兼容。
kagome 用纯Go语言编写的JP形态分析仪。
libtextcat libtextcat C库的Cgo绑定。保证与2.2版兼容。
MMSEGO 这是MMSEG的GO实现,它是中文分词算法。
nlp 从字符串中提取值,并用nlp填充您的结构。
nlp 支持LSA(潜在语义分析)的自然语言处理库。
paicehusk Paice / Husk提取算法的Golang实现。
petrovich 彼得罗维奇(Petrovich)是库,在给定的语法情况下使用俄语名称。
porter 这是Martin Porter的Porter干算法的C实现的相当简单的移植。
porter2 非常快的Porter 2 提取器。
prose 用于文本处理的库,支持标记化,词性标记,命名实体提取等。仅限英语。
RAKE.go 快速自动关键字提取算法(RAKE)的Go端口。
segment 用于执行Unicode标准附件#29中所述的Unicode文本分段的Go库
sentences 句子标记器:将文本转换为句子列表。
shamoji shamoji是用Go编写的单词过滤程序包。
snowball Go的雪球茎端口(cgo包装器)。提供单词词干提取功能Snowball本机。
stemmer 用于Go编程语言的Stemmer软件包。包括英语和德语词干。
textcat Go软件包,用于基于n-gram的文本分类,并支持utf-8和原始文本。
whatlanggo Go的自然语言检测程序包。支持84种语言和24种脚本(书写系统,例如拉丁语,西里尔字母等)。
when 自然EN和RU语言日期/时间分析器具有可插拔的规则。
  • 网络
说明
arp 包arp实现ARP协议,如RFC 826中所述。
buffstreams 通过TCP流化协议缓冲区数据变得容易。
canopus CoAP客户端/服务器实施(RFC 7252)。
cidranger Go的快速IP到CIDR查找。
dhcp6 软件包dhcp6实现了DHCPv6服务器,如RFC 3315中所述。
dns 使用DNS的Go库。
ether 用于发送和接收以太网帧的跨平台Go软件包。
ethernet 程序包ethernet实施IEEE 802.3以太网II帧和IEEE 802.1Q VLAN标签的封送处理。
fasthttp 软件包fasthttp是Go的一种快速HTTP实现,比net / http快10倍。
fortio 负载测试库和命令行工具,高级回显服务器和Web UI。允许指定设置的每秒查询负载,并记录延迟直方图和其他有用的统计数据并对其进行图形化。Tcp,Http,gRPC。
ftp 程序包ftp实现RFC 959中所述的FTP客户端。
gev gev是基于Reactor模式的轻量级,快速,无阻塞的TCP网络库。
gmqtt Gmqtt是一个灵活的高性能MQTT代理库,它完全实现了MQTT协议V3.1.1。
gnet gnet是一个高性能的,用纯围棋轻便,非阻塞,事件循环网络库。
gNxI 使用gNMI和gNOI协议的网络管理工具的集合。
go-getter Go库,用于使用URL从各种来源下载文件或目录。
go-powerdns Golang的 PowerDNS API绑定。
go-stun STUN客户端的Go实现(RFC 3489和RFC 5389)。
gobgp 使用Go编程语言实现的BGP。
golibwireshark 软件包golibwireshark使用libwireshark库来解码pcap文件并分析解剖数据。
gopacket Go库,用于使用libpcap绑定进行数据包处理。
gopcap libpcap的包装器。
goshark 软件包goshark使用tshark解码IP数据包并创建数据结构以分析数据包。
gosnmp 用于执行SNMP操作的本机Go库。
gosocsvr 套接字服务器变得简单。
gotcp 用于快速编写tcp应用程序的Go软件包。
grab 用于管理文件下载的软件包。
graval 实验性FTP服务器框架。
HTTPLab HTTPLabs可让您检查HTTP请求并伪造响应。
iplib 受python ipaddress和ruby ipaddr启发而使用IP地址(net.IP,net.IPNet)的库
jazigo Jazigo是用Go语言编写的工具,用于检索多个网络设备的配置。
kcp-go KCP-快速可靠的ARQ协议。
kcptun 基于KCP协议的极其简单和快速的udp隧道。
lhttp 强大的websocket框架,可更轻松地构建IM服务器。
linkio 用于读取器/写入器接口的网络链接速度模拟。
llb 这是代理服务器的非常简单但快速的后端。对于零内存分配和快速响应的快速重定向到预定义域很有用。
mdns Golang中的简单mDNS(多播DNS)客户端/服务器库。
mqttPaho Paho Go客户端提供了一个MQTT客户端库,用于通过TCP,TLS或WebSockets连接到MQTT代理。
NFF-Go 用于快速开发云和裸机(以前的YANFF)的高性能网络功能的框架。
packet 通过TCP和UDP发送数据包。如果需要,它可以缓冲消息和热交换连接。
peerdiscovery Pure Go库,用于使用UDP多播的跨平台本地对等发现。
portproxy 简单的TCP代理,它将不支持它的API添加到CORS支持中。
publicip 软件包publicip返回您的面向公众的IPv4地址(互联网出口)。
quic-go 在纯Go中实现QUIC协议。
raw 包raw允许在设备驱动程序级别为网络接口读取和写入数据。
sftp 程序包sftp实现SSH文件传输协议,如https://filezilla-project.org/specs/draft-ietf-secsh-filexfer-02.txt
ssh 用于构建SSH服务器的高级API(包装crypto / ssh)。
sslb 这是一个超级简单的负载均衡器,只是一个实现某种性能的小项目。
stun 实施RFC 5389 STUN协议。
tcp_server 用于更快地构建tcp服务器的Go库。
tspool TCP库使用工作池来提高性能并保护您的服务器。
utp 围棋UTP微传输协议的实现。
water 简单的TUN / TAP库。
webrtc WebRTC API的纯Go实现。
winrm 进入WinRM客户端以在Windows计算机上远程执行命令。
xtcp 具有同步全双工通信,安全关闭,自定义协议的TCP Server Framework。
  • 视频
说明
go-astisub 在GO中处理字幕(.srt,.stl,.ttml,.webvtt,.ssa / .ass,图文电视,.smi等)。
go-astits 在GO中本地解析和解复用MPEG传输流(.ts)。
go-m3u8 Apple m3u8播放列表的解析器和生成器库。
goav FFmpeg的综合Go绑定。
gst GStreamer的绑定。
libgosubs go的字幕格式支持。支持.srt,.ttml和.ass。
libvlc-go libvlc 2.X / 3.X / 4.X的绑定(由VLC媒体播放器使用)。
m3u8 Apple HLS的M3U8播放列表的解析器和生成器库。
v4l 用Go编写的Linux视频捕获库。



六、开源书籍

书籍名 推荐理由
Go palyground 不用搭建本地 Go 环境,在线就编写 Go 的代码
Go实战开发 作者是著名的 Go 开源项目 beego 的作者,他的最佳实践非常值得阅读
Go Web 编程 跟前面一本书作者是同一位,讲的是web开发
Go语言标准库 对标准库的介绍
Go入门指南 比较适合新手,内容相对基础一些
Go语言圣经 书如其名
Go语言中文网 找对圈子,学的更快
菜鸟教程 这个网站非常适合快速上手某门语言
Go语言高级编程 内容适合进阶
go语言原本 欧神出品,虽然号称进度只有9.9%/100%,但不妨碍它的优秀,值得一看
golang设计模式 设计模式 Golang实现,《研磨设计模式》的golang实现
Go语言四十二章经 可以对比查漏补缺

六、视频网课

关注公众号 回复【教程】即可在知识的海洋里呛水。