go语言适合做什么(go语言适合做嵌入式开发吗)?如果你对这个不了解,来看看!
物联网时代Java Go C/C++ 谁才是有前途的那个,下面一起来看看本站小编哼哼online给大家精心整理的答案,希望对您有帮助
go语言适合做什么(go语言适合做嵌入式开发吗)1
IT生态越来越残酷了,就业形式严峻,在职也要不停学习新东西,作为一个java码农,必须多想想日后的路。
开发离不开编程语言,流行的编程语言很多,除了常青树C/C++,Python、Java、Go等都很活跃,那么哪种更有前途呢?
Java,经过十多年的快速发展,已经很成熟,并积累了大量的资源,几乎所有的商业软件公司都在用java开发应用,算是最流行的编程语言。
2009年才发布的Go语言,可以在不损失应用程序性能的情况下降低代码的复杂性,并可以很好滴支持并行处理能力,算是后起之秀;
Python更是力压C++,成为最热门的编程语言,AI的崛起是Python的发展动力。
2019年IT软件开发现状:
根据《2019开发人员生态系统现状》报告显示,60%的开发人员更愿意从事Web后端开发,其次受欢迎的岗位分别有Web前端、移动APP。
在使用的编程语言中,JavaScript当选最常用的语言。其次为Java、Python。调查发现,Java是使用最多的语言。其用户中有44%只使用或首先使用Java。其后是其他的编程语言。
那么现状就是未来吗?
一、流行的编程语言—Java开发
自从Oracle将Java的更新周期改为一年两次之后,很多开发者“苦不堪言”。这不Java13刚发布了三个月,Java14就在招手。但是根据报告调查结果显示Java8依然是开发者最常用的版本,占比高达83%,第二位的是Java11的占22%。
另外,JavaEE8版本也是开发者最多使用的,占比高达39%。常用的应用程序服务器为Apache Tomcat。
二、有前途的编程语言—Go语言
作为后起之秀Go语言,可以不像C++那么程序看起来复杂,但是仍然具备很高的效率,特别是对多核CPU的支持是空前的好。所以Go成为最有前途的语言,Go余元也从2017年8%份额,一举提高到20%,此外,有13%的受访者还表示愿意采用或迁移到Go语言。
另外,基于Go语言的框架也越来越丰富,开发企业应用的开发速度也大幅提高,相信Go的份额会进一步提高,所以,Go的前途是不用毋庸置疑的。
三、经典的编程语言—C/C++语言
时代不管怎么变化,总有一些东西会被继承下来,这其中就有常青树编程语言C/C++,也许他没那么流行了,但是他绝对不会消失,物联网时代,大量的嵌入式设备需要开发,C语言的春天又来了。
go语言适合做什么(go语言适合做嵌入式开发吗)2
音频和音乐
用于处理音频的库。
- flac - 支持 FLAC 流的本机 Go FLAC 编码器/解码器。
- gaad - 本机 Go AAC 比特流解析器。
- GoAudio - 本机 Go 音频处理库。
- gosamplerate - 用于 go 的 libsamplerate 绑定。
- id3v2 -Go 的 ID3 解码和编码库。
- malgo - 迷你音频库。
- minimp3 - 轻量级 MP3 解码器库。
- music-theory -Go 中的音乐理论模型。
- Oto - 在多个平台上播放声音的低级库。
- PortAudio - PortAudio 音频 I/O 库的 Go 绑定。
身份验证和 OAuth
用于实现身份验证方案的库。
- authboss - 用于 Web 的模块化身份验证系统。它试图尽可能多地删除样板文件和“困难的东西”,以便每次在 Go 中启动一个新的 Web 项目时,您都可以将其插入、配置并开始构建您的应用程序,而无需每次都构建身份验证系统。
- branca - Golang 1.15+ 的布兰卡令牌规范实现.
- casbin - 支持 ACL、RBAC、ABAC 等访问控制模型的授权库。
- cookiestxt - 提供 cookies.txt 文件格式的解析器。
- go-email-normalizer - Golang 库,用于提供电子邮件地址的规范表示。
- go-guardian -Go-Guardian 是一个 golang 库,它提供了一种简单、干净和惯用的方式来创建强大的现代 API 和 Web 身份验证,支持 LDAP、Basic、Bearer 令牌和基于证书的身份验证。
- go-jose - JOSE 工作组的 JSON Web 令牌、JSON Web 签名和 JSON Web 加密规范的相当完整的实现。
- gologin - 使用 OAuth3 和 OAuth2 身份验证提供程序登录的可链接处理程序。
- gorbac - 在 Golang 中提供轻量级的基于角色的访问控制 (RBAC) 实现。
- goth - 提供了一种简单、干净和惯用的方式来使用 OAuth 和 OAuth2。开箱即用地处理多个提供程序。
- jeff - 具有可插拔后端的简单、灵活、安全和惯用的 Web 会话管理。
- jwt - 轻量级 JSON Web 令牌 (JWT) 库。
- jwt - 用于 Go 的安全、简单和快速的 JSON Web 令牌。
- jwt-auth - 用于 Golang http 服务器的 JWT 中间件,具有许多配置选项。
- loginsrv - 具有可插入后端的 JWT 登录微服务,例如 OAuth2 (Github)、htpasswd、osiam.
- oauth2 - goauth2 的继任者。通用 OAuth 2.0 包,附带 JWT、Google API、Compute Engine 和 App Engine 支持。
- osin -Golang OAuth2 服务器库。
- otpgen - 生成 TOTP/HOTP 代码的库。
- otpgo -Go的基于时间的一次性密码(TOTP)和基于 HMAC 的一次性密码(HOTP)库。
- paseto - 平台无关安全令牌(PASETO)的 Golang 实现。
- permissions2 - 用于跟踪用户、登录状态和权限的库。使用安全 cookie 和 bcrypt。
- rbac - 用于 Go 应用程序的简约 RBAC 包。
- scope - 在 Go 中轻松管理 OAuth2 范围。
- scs - HTTP 服务器的会话管理器。
- securecookie - 高效的安全 cookie 编码/解码。
- session - Web 服务器的 Go 会话管理(包括对 Google App Engine - GAE 的支持)。
- sessiongate-go - 使用 SessionGate Redis 模块进行会话管理。
- session - 用于 go http 服务器的简单、高性能、高度可定制的会话服务。
- sessionup - 简单但有效的 HTTP 会话管理和识别包。
- sjwt - 简单的 jwt 生成器和解析器。
回到顶部
区块链
构建区块链的工具。
- cosmos-sdk - 在 Cosmos 生态系统中构建公共区块链的框架。
- go-ethereum - 以太坊协议的官方 Go 实现。
- gossamer - Polkadot 主机的 Go 实现。
- solana-go - 与 Solana JSON RPC 和 WebSocket 接口交互的 Go 库。
- endermint - 高性能中间件,用于使用 Tendermint 共识和区块链协议将用任何编程语言编写的状态机转换为拜占庭容错复制状态机。
回到顶部
机器人大楼
用于构建和使用机器人的库。
- echotron - 一个优雅的并发库,用于 Go 中的 Telegram Bots。
- ephemeral-roles - 一个 Discord 机器人,用于根据语音通道成员的存在来管理临时角色。
- go-chat-bot - 用 Go 编写的 IRC、Slack 和 Telegram 机器人.
- go-joe - 受 Hubot 启发但用 Go 编写的通用机器人库。
- go-sarah - 为所需的聊天服务构建机器人的框架,包括 LINE、Slack、Gitter 等。
- go-tgbot - 纯 Golang Telegram Bot API 包装器,由 swagger 文件、基于会话的路由器和中间件生成。
- go-twitch-irc - 为 twitch.tv 聊天编写机器人的库
- Golang CryptoTrading Bot - 用于加密货币交易的基于控制台的交易机器人的 golang 实现。
- govkbot - 简单的 Go VK机器人库。
- hanu - 编写 Slack 机器人的框架。
- Kelp - Stellar DEX的官方交易和做市机器人。开箱即用,用 Golang 编写,与中心化交易所和自定义交易策略兼容。
- 拉里- 拉里是一个非常简单的 Twitter 机器人生成器,它从 Go 内置的 Github 发布随机存储库。
- margelet - 构建 Telegram 机器人的框架。
- micha - 用于 Telegram bot api 的 Go 库。
- olivia - 使用人工神经网络构建的聊天机器人。
- slack-bot - 准备好为懒惰的开发人员使用 Slack Bot:自定义命令、Jenkins、Jira、Bitbucket、Github ......
- slacker - 易于使用的框架来创建 Slack 机器人。
- slackscot - 构建 Slack 机器人的另一个框架。
- tbot - 具有类似于 net/http 的 API 的 Telegram 机器人服务器。
- telebot - 用 Go 编写的 Telegram 机器人框架。
- telego - Golang 的 Telegram Bot API 库,具有完整的一对一 API 实现。
- telegram-bot-api - 简单干净的 Telegram bot 客户端。
- teleterm - Telegram Bot Exec 终端命令。
- Tenyks - 面向服务的 IRC 机器人,使用 Redis 和 JSON 进行消息传递。
构建自动化
帮助构建自动化的库和工具。
- 1build - 命令行工具,可轻松管理特定于项目的命令。
- anko - 多种编程语言的简单应用程序观察器。
- gaper - 在 Go 项目崩溃或某些监视的文件更改时构建并重新启动它。
- gilbert - 为 Go 项目构建系统和任务运行器。
- goyek - 在 Go 中创建构建管道。
- mage - Mage 是使用 Go 的类似 make/rake 的构建工具。
- mmake - 现代品牌。
- realize - Go build system with file watchers and live reload. Run, build and watch file changes with custom paths.
- Task - simple "Make" alternative.
- taskctl - Concurrent task runner.
back to top
Command Line
Advanced Console UIs
Libraries for building Console Applications and Console User Interfaces.
- asciigraph - Go package to make lightweight ASCII line graph ╭┈╯ in command line apps with no other dependencies.
- aurora - ANSI terminal colors that supports fmt.Printf/Sprintf.
- box-cli-maker - Make Highly Customized Boxes for your CLI.
- cfmt - Contextual fmt inspired by bootstrap color classes.
- cfmt - 简单方便的格式化程式化输出,与 fmt 库完全兼容。
- chalk - 用于美化终端/控制台输出的直观包。
- colourize - 终端中 ANSI 颜色文本的 Go 库。
- ctc - 非侵入式跨平台终端颜色库,无需修改 Print 方法。
- go-ataman - 用于在终端中呈现 ANSI 彩色文本模板的 Go 库。
- go-colorable - Windows 的可着色作家。
- go-colortext - 用于终端颜色输出的 Go 库。
- go-isatty - golang 的 isatty。
- go-prompt - 受python-prompt-toolkit启发,用于构建强大的交互式提示的库。
- gocui - 旨在创建控制台用户界面的极简 Go 库。
- gommon/color - 样式终端文本。
- gookit/color - 终端显色工具库,支持16色、256色、RGB显色输出,兼容Windows。
- 标记- 匹配和标记彩色终端输出的字符串的最简单方法。
- mpb - 终端应用程序的多进度条。
- progressbar - 适用于每个操作系统的基本线程安全进度条。
- pterm - 一个库,用于美化每个平台上的控制台输出,具有许多可组合的组件。
- simpletable - 带有 Go 的终端中的简单表。
- spinner - Go 软件包,可以轻松地为终端微调器提供选项。
- tabby - 一个用于超级简单 Golang 表的小型库。
- table - 基于终端颜色的表格的小型库。
- 表格- 从命令行实用程序打印 ASCII 表,无需将大量数据传递给 API。
- termbox-go - Termbox 是一个用于创建跨平台基于文本的界面的库。
- termdash - 基于termbox-go并受termui启发的 Go 终端仪表板。
- termenv - 为您的终端应用程序提供高级 ANSI 样式和颜色支持。
- termui - 基于termbox-go的 Go 终端仪表板,灵感来自blessed-contrib .
- uilive - 用于实时更新终端输出的库。
- uiprogress - 在终端应用程序中呈现进度条的灵活库。
- uitable - 使用表格数据提高终端应用程序可读性的库。
- yacspin - 另一个 CLi Spinner 包,用于使用终端微调器。
回到顶部
标准命令行界面
用于构建标准或基本命令行应用程序的库。
- acmd - Go 中简单、有用且自以为是的 CLI 包。
- argparse - 受 Python 的 argparse 模块启发的命令行参数解析器。
- argv - 使用 bash 语法将命令行字符串拆分为参数数组的 Go 库。
- carapace - spf13/cobra 的命令参数完成生成器。
- carapace-bin - 多壳多命令参数完成器。
- cli - 基于 golang 结构标签的功能丰富且易于使用的命令行包。
- cli - 用于在 Go 中构建命令行界面的简单而完整的 API。
- climax - 具有“人脸”的替代 CLI,本着 Go 命令的精神。
- clîr - 一个简单明了的 CLI 库。无依赖。
- cmd - 扩展标准flag包以支持子命令等惯用方式。
- cmdr - 一个 POSIX/GNU 风格,类似于 getopt 的命令行 UI Go 库。
- cobra - 现代 Go CLI 交互的指挥官。
- command-chain - 用于配置和运行命令链的 go 库 - 例如 unix shell 中的流水线。
- commandeer - 对开发人员友好的 CLI 应用程序:根据结构字段和标签设置标志、默认值和用法。
- 完成- 在 Go + Go 命令 bash 完成中编写 bash 完成。
- Dnote - 具有多设备同步功能的简单命令行笔记本。
- elvish - 一种富有表现力的编程语言和多功能交互式外壳。
- env - 结构的基于标签的环境配置。
- flag - Go 支持子命令的简单但强大的命令行选项解析库。
- flaggy - 一个强大且惯用的标志包,具有出色的子命令支持。
- flagvarflag - Go 标准包的标志参数类型的集合。
- go-andotp - 用于加密/解密和 OTP文件的 CLI 程序。也可以用作图书馆。
- go-arg -Go 中基于结构的参数解析。
- go-commander -Go 库以简化 CLI 工作流程。
- go-flags - go 命令行选项解析器。
- go-getoptions - Go 选项解析器的灵感来自 Perl 的 GetOpt::Long 的灵活性。
- gocmd - 用于构建命令行应用程序的 Go 库。
- hiboot cli - 具有自动配置和依赖注入的 cli 应用程序框架。
- job - JOB,把你的短期指挥变成长期的工作。
- 主销- 支持子命令的命令行和标志解析器(由 ; 取代,kong见下文)。
- liner - 用于命令行界面的类似 readline 的库。
- mitchellh/cli - 用于实现命令行界面的 Go 库。
- mow.cli - 用于构建具有复杂标志和参数解析和验证的 CLI 应用程序的 Go 库。
- ops -Unikernel 构建器/协调器。
- pflag - Go 的标志包的直接替代品,实现 POSIX/GNU 风格的 --flags.
- sand - 用于创建解释器的简单 API 等等。
- sflags - 用于 flag、urfave/cli、pflag、cobra、kingpin 和其他库的基于结构的标志生成器。
- strumt - 创建提示链的库。
- subcmd - 解析和运行子命令的另一种方法。与标准flag包一起工作。
- ts - 时间戳转换和比较工具。
- ukautz/clif - 小型命令行界面框架。
- urfave/cli - 用于在 Go 中构建命令行应用程序的简单、快速且有趣的包(以前称为 codegangsta/cli)。
- wlog - 简单的日志接口,支持跨平台颜色和并发。
- wmenu - 易于使用的 cli 应用程序菜单结构,提示用户做出选择。
回到顶部
配置
用于配置解析的库。
- aconfig - 简单、有用和固执己见的配置加载器。
- cleanenv - 简约的配置阅读器(来自文件、ENV 和任何你想要的地方)。
- config - 用于 Go 项目的轻量级但功能强大的配置包。
- config - 云原生应用程序配置。仅用两行将 ENV 绑定到结构。
- config - 带有环境变量和标志解析的 JSON 或 YAML 配置包装器。
- configuration - 用于从 env 变量、文件、标志和“默认”标签初始化配置结构的库。
- configure - 通过多个来源提供配置,包括 JSON、标志和环境变量。
- configuro - 来自 ENV 和 Files 的自以为是的配置加载和验证框架,专注于 12-Factor 兼容的应用程序。
- confita - 将配置从多个后端级联加载到一个结构中。
- conflate - 用于合并来自任意 URL 的多个 JSON/YAML/TOML 文件的库/工具,针对 JSON 模式进行验证,以及应用模式中定义的默认值。
- env - 将环境变量解析为 Go 结构(使用默认值)。
- env - 用于将环境变量加载到结构中的轻量级包。
- envcfg - 将环境变量解组到 Go 结构。
- envconf - 来自环境的配置。
- envconfig - 从环境变量中读取您的配置。
- envh - 管理环境变量的助手。
- fig - 用于从文件和环境变量(带有验证和默认值)读取配置的微型库。
- gcfg - 将 INI 样式的配置文件读入 Go 结构;支持用户定义的类型和小节。
- genv - 使用 dotenv 支持轻松读取环境变量。
- go-aws-ssm - 从 AWS System Manager - Parameter Store 获取参数的 Go 包。
- go-conf - 基于注释结构的应用程序配置的简单库。它支持从环境变量、配置文件和命令行参数中读取配置。
- go-ini - 编组和解组 INI 文件的 Go 包。
- go-ssm-config - 用于从 AWS SSM(参数存储)加载配置参数的 Go 实用程序。
- go-up - 一个简单的配置库,具有递归占位符解析且没有魔法。
- goConfig - 解析一个结构作为输入,并使用来自命令行、环境变量和配置文件的参数填充这个结构的字段。
- godotenv - Ruby 的 dotenv 库的 Go 端口(从 加载环境变量.env).
- gofigure - 轻松配置 Go 应用程序。
- got/jconf - 模块化 JSON 配置。让您配置结构以及它们配置的代码并将解析委托给子模块,而不会牺牲完整的配置序列化。
- gonfig - 基于标签的配置解析器,它将来自不同提供者的值加载到类型安全的结构中。
- gookit/config - 应用程序配置管理(加载、获取、设置)。支持 JSON、YAML、TOML、INI、HCL。多文件加载,数据覆盖合并。
- Harvester - Harvester,一个易于使用的静态和动态配置包,支持播种、环境变量和 Consul 集成。
- hjson - 人类 JSON,人类的配置文件格式。轻松的语法,更少的错误,更多的评论。
- hocon - 用于处理 HOCON(人类友好的 JSON 超集)格式的配置库,支持环境变量、引用其他值、注释和多个文件等功能。
- ingo - 标志保留在类似 ini 的配置文件中。
- ini - 用于读取和写入 INI 文件的包。
- ini - INI 解析器和写入库,解组到结构,编组到 Json,写入文件,监视文件。
- joshbetz/config - Go 的小型配置库,可解析环境变量、JSON 文件并在 SIGHUP 上自动重新加载。
- kelseyhightower/envconfig - 用于管理来自环境变量的配置数据的 Go 库。
- koanf - 轻量级、可扩展的库,用于读取 Go 应用程序中的配置。内置对 JSON、TOML、YAML、env、命令行的支持。
- konfig - 分布式处理时代的 Go 的可组合、可观察和高性能配置处理。
- kong - 命令行解析器,支持任意复杂的命令行结构和额外的配置源,例如 YAML、JSON、TOML 等(继任者kingpin)。
- mini - 用于解析 ini 样式配置文件的 Golang 包。
- nasermirzaei89/env - 用于读取环境变量的简单有用的包。
- onion - 基于层的 Go 配置,支持 JSON、TOML、YAML、属性、etcd、env 和使用 PGP 的加密。
- piper - 具有配置继承和密钥生成的 Viper 包装器。
- store -Go 的轻量级配置管理器。
- 交换- 基于构建环境递归地实例化/配置结构。(YAML、TOML、JSON 和环境)。
- typenv - 简约、零依赖、类型化的环境变量库。
- uConfig - 轻量级、零依赖和可扩展的配置管理。
- viper - 使用尖牙进行配置。
- XDG 基本目录规范和XDG 用户目录的xdg -Go 实现。
- xdg - 遵循XDG 标准的跨平台包。
回到顶部
持续集成
帮助持续集成的工具。
- CDS - 企业级 CI/CD 和 DevOps 自动化开源平台。
- drone -Drone 是一个基于 Docker 的持续集成平台,用 Go 编写。
- duci - 一个简单的 ci 服务器,不需要特定领域的语言。
- gomason - 从干净的工作区测试、构建、签名和发布您的 go 二进制文件。
- gotestfmt - 为人类进行测试输出。
- govalls - Coveralls.io 连续代码覆盖跟踪系统的 Go 集成。
- 工作服- Multi-Package go 项目封面配置文件,用于 goveralls 等工具。
- roveralls - 递归覆盖测试工具。
回到顶部
CSS 预处理器
用于预处理 CSS 文件的库。
- gcss - 纯 Go CSS 预处理器。
- go-libsass - 包装 100% Sass 兼容的 libsass 项目。
回到顶部
数据结构
Go 中的通用数据结构和算法。
- 2q - 2Q 内存缓存实现。
- 算法- 算法和数据结构。CLRS 研究。
- bingo - 将本机类型快速、零分配、保持字典顺序的打包成字节。
- binpacker - 二进制打包器和解包器帮助用户构建自定义二进制流。
- bit - Golang 设置数据结构,具有额外的位旋转功能。
- bitmap - Go 中密集、零分配、启用 SIMD 的位图/位集。
- bitset - 实现 bitset 的 Go 包。
- Bloom - 实现 Bloom 过滤器的 Go 包。
- Bloom - 在 Go 中实现的 Bloom 过滤器。
- bloom -Golang 布隆过滤器实现。
- bloomfilter - Go 中的另一个 Bloomfilter 实现,与 Java 的 Guava 库兼容.
- boomfilters - 用于处理连续、无界流的概率数据结构。
- cmap - go 的线程安全并发映射,支持interface{}用作键和自动扩展分片。
- concurrent-writer - 高度并发的替代bufio.Writer.
- conjungo - 一个小型、强大且灵活的合并库。
- count-min-log -Go 实现 Count-Min-Log 草图:使用近似计数器进行近似计数(类似于 Count-Min 草图,但使用更少的内存).
- crunch - Go 包实现用于轻松处理各种数据类型的缓冲区。
- cuckoo-filter - Cuckoo 过滤器:一个全面的布谷鸟过滤器,与其他工具相比可配置和空间优化,原论文中提到的所有功能都可用。
- cuckoofilter - Cuckoo 过滤器:Go 中实现的计数布隆过滤器的一个很好的替代品。
- deque - 高度优化的双端队列。
- deque - 快速环形缓冲区双端队列(双端队列)。
- dict - 用于 Go 的类似 Python 的字典 (dict)。
- dsu - Go 中的不相交集数据结构实现。
- encoding -Go 的整数压缩库。
- fsm - 有限状态机包。
- gdcache - 一个由 golang 实现的纯非侵入式缓存库,您可以使用它来实现自己的分布式缓存。
- go-adaptive-radix-tree - 自适应基数树的 Go 实现。
- go-datastructures - 有用的、高性能的和线程安全的数据结构的集合。
- go-edlib - 与 Unicode 兼容的 Go 字符串比较和编辑距离算法库(Levenshtein、LCS、Hamming、Damerau levenshtein、Jaro-Winkler 等)。
- go-ef - Elias-Fano 编码的 Go 实现。
- go-geoindex - 内存中的地理索引。
- go-mcache - 快速的内存键:值存储/缓存库。指针缓存。
- go-rquad - 具有高效点定位和邻居查找的区域四叉树。
- gocache - 一个完整的 Go 缓存库,具有多个存储(内存、memcache、redis ......)、可链接、可加载、指标缓存等。
- goconcurrentqueue - 并发 FIFO 队列。
- 众神- Go 数据结构。容器、集合、列表、堆栈、地图、BidiMaps、树、HashSet 等。
- gofal - Go 的分数 api。
- golang-set -Go 的线程安全和非线程安全高性能集。
- goset - 一个有用的 Go 集合集合实现。
- goskiplist -Go中的跳过列表实现。
- gostl - go 的数据结构和算法库,旨在提供类似于 C++ STL 的功能。
- gota - Go 的数据帧、系列和数据整理方法的实现。
- geterator - 提供 map 和 reduce 功能的迭代器实现。
- hashsplit - 将字节流拆分成块,并将块排列成树,边界由内容决定,而不是位置。
- hide - 带有编组到/来自散列的 ID 类型,以防止向客户端发送 ID。
- hilbert - Go 包,用于将值映射到空间填充曲线,例如 Hilbert 和 Peano 曲线。
- hyperloglog - 具有 Sparse、LogLog-Beta 偏差校正和 TailCut 空间减少的 HyperLogLog 实现.
- iter - C++ STL 迭代器和算法的 Go 实现。
- levenshtein - Levenshtein 距离和相似度指标,具有可定制的编辑成本和通用前缀的 Winkler 式奖金。
- levenshtein - 在 Go 中计算 levenshtein 距离的实现。
- memlog - 受 Apache Kafka 启发的易于使用、轻量级、线程安全且仅追加的内存数据结构。
- merkle - Merkle 根哈希和包含证明的空间高效计算。
- merkletree - merkle 树的实现,提供对数据结构内容的有效和安全的验证。
- mspm - 用于信息检索的多字符串模式匹配算法。
- nan - 一个库中的零分配 Nullable 结构,具有方便的转换功能、编组器和解组器。
- null - 可以编组/解组到 JSON 的可空 Go 类型。
- ordered-concurrently - Go 模块,它同时处理工作并按输入顺序在通道中返回输出。
- parapipe - FIFO 管道,在每个阶段并行执行,同时保持消息和结果的顺序。
- parsefields - 用于解析类似 JSON 的日志以收集唯一字段和事件的工具。
- 管道- 具有扇入和扇出的管道实现。
- ptrie - 前缀树的实现。
- remember-go - 用于缓存慢速数据库查询的通用接口(由 redis、memcached、ristretto 或 in-memory 支持)。
- ring - 高性能、线程安全的布隆过滤器的 Go 实现。
- roaring - 实现压缩位集的 Go 包。
- set - Go 中使用 LinkedHashMap 的简单集合数据结构实现。
- skiplist - 非常快的 Go Skiplist 实现。
- skiplist -Go 中的 Skiplist 实现。
- slices - 对切片进行操作的函数;喜欢package strings但适用于切片。
- timedmap - 带有过期键值对的映射。
- treap - 使用树堆的持久、快速有序的地图。
- treemap - 在引擎盖下使用红黑树的通用键排序图。
- trie - Go 中的 Trie 实现。
- ttlcache - 具有项目过期和泛型的内存缓存。
- typ - Null 类型、安全的原始类型转换和从复杂结构中获取值。
回到顶部
数据库
用 Go 实现的数据库。
- badger -Go 中的快速键值存储。
- bbolt - Go 的嵌入式键/值数据库。
- bcache - 最终一致的分布式内存缓存 Go 库。
- BigCache - 用于千兆字节数据的高效键/值缓存。
- Bitcask -Bitcask 是一个可嵌入、持久且快速的键值 (KV) 数据库,用纯 Go 编写,具有可预测的读/写性能、低延迟和高吞吐量,这要归功于 bitcask 磁盘布局 (LSM+WAL)。
- buntdb - 用于 Go 的快速、可嵌入的内存键/值数据库,具有自定义索引和空间支持。
- 缓存- 内存中键:具有过期时间、0 依赖项、<100 LoC、100% 覆盖率的值存储。
- cache2go - 内存中键:值缓存,支持基于超时自动失效。
- clover - 用纯 Golang 编写的轻量级的面向文档的 NoSQL 数据库。
- clusteredBigCache - 具有集群支持和单个项目到期的 BigCache。
- cockroach - 可扩展的、地理复制的、事务性数据存储。
- Coffer - 支持事务的简单 ACID 键值数据库。
- column - 具有位图索引和事务的高性能、列式、可嵌入内存存储。
- couchcache - 由 Couchbase 服务器支持的 RESTful 缓存微服务。
- CovenantSQL - CovenantSQL 是区块链上的 SQL 数据库。
- Databunker - 为遵守 GDPR 和 CCPA 而构建的个人身份信息 (PII) 存储服务。
- dgraph - 可扩展、分布式、低延迟、高吞吐量的图形数据库。
- diskv - 本土磁盘支持的键值存储。
- dtf - 分布式事务管理器。支持 XA、TCC、SAGA、可靠消息。
- eliasdb - 具有 REST API、短语搜索和类似 SQL 的查询语言的无依赖、事务性图形数据库。
- fastcache - 用于大量条目的快速线程安全内存缓存。最小化 GC 开销。
- GCache - 支持过期缓存、LFU、LRU 和 ARC 的缓存库。
- go-cache - Go 的内存中键:值存储/缓存(类似于 Memcached)库,适用于单机应用程序。
- godis - Golang 实现的高性能 Redis 服务器和集群。
- goleveldb - 在 Go 中实现LevelDB键/值数据库。
- groupcache - Groupcache 是一个缓存和缓存填充库,旨在在许多情况下替代 memcached。
- hare - 一个简单的数据库管理系统,将每个表存储为行分隔的 JSON 文本文件。
- immudb - immudb 是用于用 Go 编写的系统和应用程序的轻量级、高速不可变数据库。
- influxdb - 用于指标、事件和实时分析的可扩展数据存储。
- Kivik - Kivik 为 CouchDB、PouchDB 和类似数据库提供了一个通用的 Go 和 GopherJS 客户端库。
- ledisdb - Ledisdb 是一个类似于 Redis 的高性能 NoSQL,基于 LevelDB.
- levigo - Levigo 是 LevelDB 的 Go 包装器.
- lotusdb - 与 lsm 和 b+tree 兼容的快速 k/v 数据库。
- Milvus - Milvus 是一个用于嵌入管理、分析和搜索的矢量数据库。
- moss -Moss 是一个简单的 LSM 键值存储引擎,用 100% Go 编写。
- nutsdb - Nutsdb 是一个用纯 Go 编写的简单、快速、可嵌入、持久的键/值存储。它支持完全可序列化的事务和许多数据结构,例如列表、集合、排序集合。
- piladb - 基于堆栈数据结构的轻量级 RESTful 数据库引擎。
- pogreb - 用于读取繁重工作负载的嵌入式键值存储。
- prometheus - 监控系统和时间序列数据库。
- pudge - 使用 Go 的标准库编写的快速简单的键/值存储。
- rosedb - 基于 LSM+WAL 的嵌入式 kv 数据库,支持 string、list、hash、set、zset。
- rqlite - 基于 SQLite 构建的轻量级分布式关系数据库。
- Scribble - 微型平面文件 JSON 存储。
- tempdb - 临时项目的键值存储。
- tidb - TiDB 是一个分布式 SQL 数据库。灵感来自 Google F1 的设计。
- tiedot - 由 Golang 提供支持的 NoSQL 数据库。
- ttlcache - 内存中键值存储,每条记录都有 TTL。
- unitdb - 用于物联网、实时消息传递应用程序的快速时间序列数据库。使用 github.com/unit-io/unitd 应用程序通过 tcp 或 websocket 使用 pubsub 访问 unitdb。
- Vasto - 分布式高性能键值存储。在磁盘上。最终一致。哈。能够在不中断服务的情况下增长或缩小。
- VictoriaMetrics - 快速、资源有效且可扩展的开源时间序列数据库。可用作 Prometheus 的长期远程存储。支持 PromQL。
数据库模式迁移。
- atlas - 一个数据库工具包。旨在帮助公司更好地处理数据的 CLI。
- avro - 发现 SQL 模式并将它们转换为 AVRO 模式。将 SQL 记录查询为 AVRO 字节。
- darwin -Go 的数据库模式演变库。
- go-fixtures - Golang 优秀的内置数据库/sql 库的 Django 样式夹具。
- go-pg-migrate - 用于 go-pg 迁移管理的 CLI 友好包。
- go-pg-migrations - 一个 Go 包,用于帮助使用 go-pg/pg 编写迁移。
- goavro - 一个对 Avro 数据进行编码和解码的 Go 包。
- godfish - 数据库迁移管理器,使用原生查询语言。支持 cassandra、mysql、postgres、sqlite3。
- goose - 数据库迁移工具。您可以通过创建增量 SQL 或 Go 脚本来管理数据库的演变。
- gormigrate -Gorm ORM 的数据库模式迁移助手。
- migrate - 数据库迁移。CLI 和 Golang 库。
- 迁移器- 死的简单 Go 数据库迁移库。
- migrator - MySQL 数据库迁移器,旨在运行迁移到您的功能并使用直观的 go 代码管理数据库模式更新。
- pravasan - 简单的迁移工具 - 目前用于 MySQL,但计划很快支持 Postgres、SQLite、MongoDB 等。
- schema - 用于在 Go 二进制文件中嵌入数据库/sql 兼容数据库的模式迁移的库。
- skeema - MySQL 的纯 SQL 模式管理系统,支持分片和外部在线模式更改工具。
- soda - 用于 MySQL、PostgreSQL 和 SQLite 的数据库迁移、创建、ORM 等。
- sql-migrate - 数据库迁移工具。允许使用 go-bindata 将迁移嵌入到应用程序中。
- sqlize - 数据库迁移生成器。允许通过不同的方式从模型和现有 sql 生成 sql 迁移。
数据库工具。
- chproxy - ClickHouse 数据库的 HTTP 代理。
- clickhouse-bulk - 收集小型插入并将大型请求发送到 ClickHouse 服务器。
- datagen - 一种快速数据生成器,支持多表并支持多行 DML。
- dbbench - 支持多个数据库和脚本的数据库基准测试工具。
- go-mysql - 用于处理 MySQL 协议和复制的工具集。
- go-mysql-elasticsearch - 将您的 MySQL 数据自动同步到 Elasticsearch.
- kingshard - kingshard 是由 Golang 提供支持的 MySQL 的高性能代理.
- myreplication - MySql 二进制日志复制侦听器。支持基于语句和行的复制。
- octillery - 用于分片数据库的 Go 包(支持每个 ORM 或原始 SQL)。
- orchestrator - MySQL 复制拓扑管理器和可视化器。
- pg_timetable - PostgreSQL 的高级调度。
- pgweb - 基于 Web 的 PostgreSQL 数据库浏览器。
- prep - 在不更改代码的情况下使用准备好的 SQL 语句。
- perst - 简化和加速开发,在任何 Postgres 应用程序(现有的或新的)上即时、实时、高性能。
- rdb - 用于二次开发和内存分析的 Redis RDB 文件解析器。
- rwdb - rwdb 为多个数据库服务器设置提供读取副本功能。
- vitess - vitess 提供有助于扩展 MySQL 数据库以实现大规模 Web 服务的服务器和工具。
SQL 查询构建器,用于构建和使用 SQL 的库。
- bqb - 轻量级且易于学习的查询构建器。
- buildsqlx - 用于 PostgreSQL 的 Go 数据库查询构建器库。
- dbq - Go 的零样板数据库操作。
- Dotsql - Go 库,可帮助您将 sql 文件保存在一个地方并轻松使用它们。
- gendry - 非侵入性 SQL 构建器和强大的数据绑定器。
- godbal - 用于 Go 的数据库抽象层(dbal)。支持SQL builder,轻松获取结果。
- goqu - 惯用的 SQL 构建器和查询库。
- gosql - 具有更好的空值支持的 SQL 查询构建器。
- hasql - 用于访问多主机 SQL 数据库安装的库。
- igor - PostgreSQL 的抽象层,支持高级功能并使用类似 gorm 的语法。
- jet - 用于在 Go 中编写类型安全 SQL 查询的框架,能够轻松地将数据库查询结果转换为所需的任意对象结构。
- mpath - 用于 SQL 记录的 MPTT(修改前序树遍历)包 - 物化路径实现。
- ormlite - 轻量级包,包含一些类似 ORM 的功能和 sqlite 数据库的帮助程序。
- ozzo-dbx - 强大的数据检索方法以及与数据库无关的查询构建功能。
- qry - 使用原始 SQL 查询从文件生成常量的工具。
- sq - Go 的类型安全 SQL 构建器和结构映射器。
- sqlf - 快速 SQL 查询生成器。
- sqlingo - 在 Go 中构建 SQL 的轻量级 DSL。
- sqrl - SQL 查询构建器,Squirrel 的分支,具有改进的性能。
- Squalus - Go SQL 包上的薄层,可以更轻松地执行查询。
- Squirrel - 帮助您构建 SQL 查询的 Go 库。
- xo - 根据现有模式定义或支持 PostgreSQL、MySQL、SQLite、Oracle 和 Microsoft SQL Server 的自定义查询为数据库生成惯用的 Go 代码。
回到顶部
数据库驱动程序
用于连接和操作数据库的库。
- 关系数据库
- avatica - 用于数据库/sql 的 Apache Avatica/Phoenix SQL 驱动程序。
- bgc - 适用于 Go 的 BigQuery 的数据存储连接。
- firebirdsql -Go 的 Firebird RDBMS SQL 驱动程序。
- go-adodb - 使用数据库/sql 的 Microsoft ActiveX 对象数据库驱动程序。
- go-mssqldb - 用于 Go 的 Microsoft MSSQL 驱动程序。
- go-oci8 - 使用数据库/sql 的 Oracle 驱动程序。
- go-sql-driver/mysql -Go 的 MySQL 驱动程序。
- go-sqlite3 - 使用数据库/sql 的 go 的 SQLite3 驱动程序。
- godror - 用于 Go 的 Oracle 驱动程序,使用 ODPI-C 驱动程序。
- gofreetds - Microsoft MSSQL 驱动程序。在FreeTDS上进行包装。
- pgx - PostgreSQL 驱动程序支持超出数据库/sql 公开的功能。
- pig - 简单的pgx包装器,可以轻松地执行和扫描查询结果。
- pq - 用于数据库/sql 的纯 Go Postgres 驱动程序。
- Squinn-Go - 纯 Go 的 SQLite.
- sqlhooks - 将挂钩附加到任何数据库/sql 驱动程序。
- NoSQL 数据库
- aerospike-client-go -Go 语言的 Aerospike 客户端。
- arangolite -ArangoDB的轻量级 golang 驱动程序。
- asc - 适用于 Aerospike 的数据存储连接。
- Forestdb -ForestDB的 Go 绑定。
- go-couchbase -Go中的 Couchbase 客户端。
- go-pilosa -Pilosa 的Go 客户端库.
- go-rejson - 使用 Redigo golang 客户端的 redislabs 的 ReJSON 模块的 Golang 客户端。在 redis 中轻松地将结构存储和操作为 JSON 对象。
- gocb - 官方 Couchbase Go SDK。
- gocosmosdatabase/sql - Azure Cosmos DB 的REST 客户端和标准驱动程序。
- gocql - Apache Cassandra 的 Go 语言驱动程序。
- godis - 受 jedis 启发,由 golang 实现的 redis 客户端。
- godscache - Google Cloud Platform Go Datastore 包的包装器,它使用 memcached 添加缓存。
- gomemcache - Go 编程语言的 memcache 客户端库。
- gorethink - RethinkDB 的 Go 语言驱动程序。
- goriak - Riak KV 的 Go 语言驱动程序。
- mgm - Go 的基于 MongoDB 模型的 ODM(基于官方 MongoDB 驱动程序).
- mgo - Go 语言的(未维护的)MongoDB 驱动程序,它在遵循标准 Go 习惯用法的非常简单的 API 下实现了丰富且经过良好测试的功能选择。
- mongo-go-driver -Go 语言的官方 MongoDB 驱动程序。
- neo4j -Golang的 Neo4j Rest API 绑定.
- Neo4j-GO -golang 中的 Neo4j REST 客户端.
- neoism -Golang的 Neo4j 客户端。
- qmgo - Go 的 MongoDB 驱动程序。它基于官方的 MongoDB 驱动程序,但像 Mgo 一样更易于使用。
- redeo - Redis 协议兼容的 TCP 服务器/服务。
- redigo - Redigo 是 Redis 数据库的 Go 客户端。
- redis - Golang 的 Redis 客户端。
- rueidis - 具有自动流水线和服务器辅助客户端缓存的快速 Redis RESP3 客户端。
- xredis - 类型安全、可定制、干净且易于使用的 Redis 客户端。
- 搜索和分析数据库。
- bleve - 用于 Go 的现代文本索引库。
- elastic - Go 的 Elasticsearch 客户端。
- elasticsql - 在 Go 中将 sql 转换为 elasticsearch dsl.
- elastigo - Elasticsearch 客户端库。
- go-elasticsearch -Go 的官方 Elasticsearch 客户端。
- go - 与 Elasticsearch 交互的库。
- riot - 开源、分布式、简单高效的搜索引擎。
- skizze - 概率数据结构服务和存储。
- 多个后端。
- cachego - 用于多个驱动程序的 Golang 缓存组件。
- cayley - 支持多个后端的图形数据库。
- dsc - SQL、NoSQL、结构化文件的数据存储连接。
- gokv - Go 的简单键值存储抽象和实现(Redis、Consul、etcd、bbolt、BadgerDB、LevelDB、Memcached、DynamoDB、S3、PostgreSQL、MongoDB、CockroachDB 等等)。
错误处理
日期和时间
用于处理日期和时间的库。
- carbon - 一个简单、语义化且对开发人员友好的 golang 日期时间包。
- carbon - 具有许多实用方法的简单时间扩展,从 PHP Carbon 库移植。
- cronrange - 解析 Cron 风格的时间范围表达式,检查给定时间是否在任何范围内。
- 日期- 增加使用日期、日期范围、时间跨度、时段和时间的时间。
- dateparse - 在事先不知道格式的情况下解析日期。
- durafmt - Go 的持续时间格式化库。
- feiertage - 一组计算德国公共假期的函数,包括。德国(Bundesländer)各州的专业化。比如复活节、五旬节、感恩节……
- go-persian-calendar -Go(golang)中波斯(太阳回历)日历的实现.
- go-str2duration - 将字符串转换为持续时间。支持 time.Duration 返回字符串等。
- go-sunrise - 计算给定位置的日出和日落时间。
- go-week - 处理 ISO8601 周日期的有效软件包。
- gostradamus - 用于处理日期的 Go 包。
- iso8601 - 无需正则表达式即可有效解析 ISO8601 日期时间。
- kair - 日期和时间 - Golang 格式库。
- now - 现在是 golang 的时间工具包。
- NullTime - 可空time.Time。
- strftime - C99 兼容的 strftime 格式化程序。
- 时间跨度- 用于与时间间隔进行交互,定义为开始时间和持续时间。
- timeutil - 对 golang 时间包的有用扩展(Timedelta,Strftime,...)。
- tuesday - Ruby 兼容的 Strftime 函数。
形式
分布式系统
有助于构建分布式系统的软件包。
- arpc - 更有效的网络通信,支持双向呼叫、通知、广播。
- celeriac - 添加对交互和监控 Celery 工作人员、Go 中的任务和事件的支持的库。
- 一致的 - 有界负载的一致散列。
- 一致哈希 - 具有可配置副本的一致哈希。
- dht -BitTorrent Kademlia DHT 实现。
- digota - grpc 电子商务微服务。
- dot - 使用操作转换/OT 的分布式同步。
- doublejump - 改进的 Google 跳转一致哈希。
- Dragonboat -Go中功能完整且高性能的多组 Raft 库。
- drmaa - 基于 DRMAA 标准的集群调度程序的作业提交库。
- dynamolock - DynamoDB 支持的分布式锁定实现。
- dynatomic - 使用 DynamoDB 作为原子计数器的库。
- emitter-io - 使用 MQTT、Websockets 和 love 构建的高性能、分布式、安全和低延迟的发布-订阅平台。
- failured - 分布式系统的自适应应计故障检测器。
- flowgraph - 基于流的编程包。
- gleam - 用纯 Go 和 Luajit 编写的快速且可扩展的分布式 map/reduce 系统,结合了 Go 的高并发性和 Luajit 的高性能,可以独立运行或分布式运行。
- glow - 易于使用的可扩展分布式大数据处理、Map-Reduce、DAG 执行,全部在纯 Go 中。
- gmsec - Go 分布式系统开发框架。
- go-doudou - 一个基于 gossip 协议和 OpenAPI 3.0 规范的去中心化微服务框架。专注于低代码和快速开发的内置 go-doudou cli 可以提高您的生产力。
- go-health - 用于在您的服务中启用异步依赖健康检查的库。
- go-jump - 谷歌“跳转”一致性哈希函数的端口。
- go-kit - 支持服务发现、负载平衡、可插拔传输、请求跟踪等的微服务工具包。
- go-micro - 分布式系统开发框架。
- go-mysql-lock - 基于 MySQL 的分布式锁。
- go-pdu - 一个分散的基于身份的社交网络。
- go-sundheit - 一个库,旨在为定义 golang 服务的异步服务健康检查提供支持。
- go-zero - 一个 web 和 rpc 框架。它的诞生是为了通过弹性设计确保繁忙站点的稳定性。内置 goctl 大大提高了开发效率。
- gorpc - 用于高负载的简单、快速和可扩展的 RPC 库。
- grpc-go - gRPC 的 Go 语言实现。基于 HTTP/2 的 RPC。
- hprose - 非常新的 RPC 库,现在支持 25 多种语言。
- jsonrpc - jsonrpc 包帮助实现 JSON-RPC 2.0.
- jsonrpc - JSON-RPC 2.0 HTTP 客户端实现。
- Kratos - Go 中模块化设计且易于使用的微服务框架。
- liftbridge - 用于 NATS 的轻量级、容错消息流。
- lura - 带有中间件的超高性能 API 网关框架。
- micro - 云及其他分布式系统运行时。
- NATS - 用于微服务、物联网和云原生系统的轻量级、高性能消息传递系统。
- outboxer - Outboxer 是一个实现发件箱模式的 go 库。
- pglock - PostgreSQL 支持的分布式锁定实现。
- pjrpc - 带有 Protobuf 规范的 Golang JSON-RPC 服务器客户端。
- raft - Raft 共识协议的 Golang 实现,由 HashiCorp.
- raft - 由 CoreOS 实现 Raft 共识协议。
- rain -BitTorrent 客户端和库。
- redis-lock - 使用 Redis 的简化分布式锁定实现。
- resgate - 用于构建 REST、实时和 RPC API 的实时 API 网关,所有客户端都在其中无缝同步。
- ringpop-go -Go 应用程序的可扩展、容错应用层分片。
- rpcx - 类似于阿里巴巴 Dubbo 的分布式可插拔 RPC 服务框架。
- Semaphore - 一个简单的(微)服务编排器。
- sleuth - 用于无主 p2p 自动发现和 HTTP 服务之间的 RPC 的库(使用ZeroMQ)。
- torrent -BitTorrent 客户端软件包。
回到顶部
动态 DNS
用于更新动态 DNS 记录的工具。
- DDNS - 以 Digital Ocean Networking DNS 作为后端的个人 DDNS 客户端。
- dyndns - 后台 Go 进程定期自动检查您的 IP 地址,并在您的地址更改时更新(一个或多个)Google 域的动态 DNS 记录。
- GoDNS - 一个动态 DNS 客户端工具,支持 DNSPod 和 HE.net,用 Go 编写。
回到顶部
电子邮件
实现电子邮件创建和发送的库和工具。
- chasquid - 用 Go 编写的 SMTP 服务器。
- douceur - 用于 HTML 电子邮件的 CSS 内联器。
- email - 一个强大而灵活的 Go 电子邮件库。
- email-verifier - 用于电子邮件验证的 Go 库,无需发送任何电子邮件。
- go-dkim - DKIM 库,用于签名和验证电子邮件。
- go-email-validator - 用于语法、一次性、smtp 等检查的模块化电子邮件验证器。
- go-imap - 用于客户端和服务器的 IMAP 库。
- go-message - Internet 消息格式和邮件消息的流媒体库。
- go-premailer -Go中 HTML 邮件的内联样式。
- go-simple-mail - 使用 SMTP Keep Alive 和两个超时发送电子邮件的非常简单的包:连接和发送。
- Hectane - 提供 HTTP API 的轻量级 SMTP 客户端。
- hermes - 生成干净、响应式 HTML 电子邮件的 Golang 包。
- mailchain - 将加密的电子邮件发送到用 Go 编写的区块链地址。
- mailgun-go - 使用 Mailgun API 发送邮件的 Go 库。
- MailHog - 使用 Web 和 API 接口进行电子邮件和 SMTP 测试。
- mailx -Mailx 是一个库,可以更轻松地通过 SMTP 发送电子邮件。它是对 golang 标准库的增强net/smtp。
- SendGrid - SendGrid 用于发送电子邮件的 Go 库。
- smtp - SMTP 服务器协议状态机。
- smtpmock - 轻量级的可配置多线程假 SMTP 服务器。为您的测试环境模拟任何 SMTP 行为。
- truemail-go - 可配置的 Golang 电子邮件验证器/验证器。通过 Regex、DNS、SMTP 等验证电子邮件。
回到顶部
可嵌入的脚本语言
在你的 go 代码中嵌入其他语言。
- anko - 用 Go 编写的脚本解释器。
- binder - 转到基于gopher-lua的 Lua 绑定库。
- cel-go - 快速、便携、非图灵完整的表达式评估,带有渐进式输入。
- ecal - 一种简单的可嵌入脚本语言,支持并发事件处理。
- expr - Go 的表达式评估引擎:快速、非图灵完备、动态类型、静态类型。
- gentee - 可嵌入的脚本编程语言。
- gisp -Go中的简单 LISP。
- go-duktape - Go 的 Duktape JavaScript 引擎绑定。
- go-lua - Lua 5.2 VM 到纯 Go 的端口。
- go-php -Go 的 PHP 绑定。
- go-python - 天真的 go 绑定到 CPython C-API。
- goja -Go 中的ECMAScript 5.1(+) 实现。
- golua - Lua C API 的 Go 绑定。
- gopher-lua - 用 Go 编写的 Lua 5.1 VM 和编译器.
- gval - 用 Go 编写的高度可定制的表达式语言。
- metacall - 支持 NodeJS、JavaScript、TypeScript、Python、Ruby、C#、WebAssembly、Java、Cobol 等的跨平台 Polyglot 运行时。
- ngaro - 可嵌入的 Ngaro VM 实现在 Retro 中启用脚本。
- prolog - 可嵌入的 Prolog。
- purl - 嵌入在 Go 中的 Perl 5.18.2.
- tengo - Go 的字节码编译脚本语言。
回到顶部
错误处理
用于处理错误的库。
- emperror - Go 库和应用程序的错误处理工具和最佳实践。
- eris - 在 Go 中处理、跟踪和记录错误的更好方法。兼容标准错误库和 github.com/pkg/errors。
- errlog - 确定错误源代码的可破解包(以及其他一些快速调试功能)。可就地插入任何记录器。
- errors - 标准库错误包和 github.com/pkg/errors 的直接替换。提供各种错误处理原语。
- errors - 提供简单错误处理原语的包。
- errors - 使用分类原语进行简单的 golang 错误处理。
- errors - 最简单的错误包装器,具有出色的性能和最小的内存开销。
- errors - 用于构建 Go 错误的直接替换。这是一个最小的错误处理包,带有自定义错误类型、用户友好的消息、Unwrap & Is。具有非常易于使用和直接的辅助功能。
- errorx - 一个功能丰富的错误包,带有堆栈跟踪、错误组合等。
- Falcon - 一个简单但功能强大的错误处理包。
- go-multierror - Go (golang) 包,用于将错误列表表示为单个错误。
- tracerr - 堆栈跟踪和源代码片段的 Golang 错误。
回到顶部
文件处理
用于处理文件和文件系统的库。
- afero -Go的文件系统抽象系统。
- afs - Go 的抽象文件存储(mem、scp、zip、tar、云:s3、gs)。
- baraka - 一个轻松处理 http 文件上传的库。
- bigfile - 文件传输系统,支持使用 http api、rpc 调用和 ftp 客户端管理文件。
- 校验和- 计算大文件的消息摘要,如 MD5、SHA256、SHA1、CRC 或 BLAKE2s。
- 复制- 递归复制目录。
- flop - 文件操作库,旨在与GNU cp镜像功能奇偶校验。
- gdu - 带有控制台界面的磁盘使用分析器。
- go-csv-tag - 使用标签加载 csv 文件。
- go-decent-copy - 为人类复制文件。
- go-exiftool - ExifTool 的 Go 绑定,ExifTool 是著名的库,用于从文件(图片、PDF、办公室等)中提取尽可能多的元数据(EXIF、IPTC 等).
- go-gtfs - 在 go 中加载 gtfs 文件。
- gofs - 开箱即用的文件同步工具。
- gut/yos - 简单可靠的文件操作包,例如文件、目录和符号链接上的复制/移动/差异/列表。
- higgs - 一个小型跨平台 Go 库,用于隐藏/取消隐藏文件和目录。
- notify - 具有简单 API 的文件系统事件通知库,类似于 os/signal.
- opc - 为 Go 加载开放打包约定 (OPC) 文件。
- parquet - 读取和写入parquet文件。
- pathtype - 将路径视为自己的类型,而不是使用字符串。
- pdfcpu - PDF 处理器。
- skywalker - 允许一个人轻松地同时通过文件系统的软件包。
- stl - 用于读取和写入 STL(立体光刻)文件的模块。用于读取的并发算法。
- tarfs - tar 文件FileSystem接口的实现。
- todotxt - Gina Trapani 的todo.txt文件的 Go 库,支持解析和操作todo.txt格式的任务列表。
- vfs - 一组可插入、可扩展和自以为是的文件系统功能,用于 Go 跨多种文件系统类型,如 os、S3 和 GCS。
回到顶部
金融的
会计和财务软件包。
- 会计- golang 的货币和货币格式。
- ach - 自动票据交换所 (ACH) 文件的读取器、写入器和验证器。
- 货币- 处理货币金额,提供货币信息和格式。
- currency - 高性能和准确的货币计算包。
- decimal - 任意精度的定点十进制数。
- fastme - 快速可扩展匹配引擎 Go 实现。
- go-finance -Go 中的综合金融市场数据。
- go-finance - 货币时间价值(年金)、现金流、利率转换、债券和折旧计算的财务函数库。
- go-finance - 获取汇率、通过 VIES 检查增值税号和检查 IBAN 银行帐号的模块。
- go-finnhub - 来自 finnhub.io 的股票市场、外汇和加密数据客户端。访问来自 60 多家证券交易所、10 家外汇经纪商和 15 多家加密货币交易所的实时金融市场数据。
- go-money - 福勒金钱模式的实现。
- ofxgo - 查询 OFX 服务器和/或解析响应(使用示例命令行客户端)。
- orderbook - Golang 中限价订单簿的匹配引擎。
- payme - 用于 SEPA 付款的 QR 码生成器(ASCII 和 PNG)。
- sleet - 多个支付服务提供商 (PsP) 处理在线支付的统一接口。
- techan - 具有高级市场分析和交易策略的技术分析库。
- ticker - 终端股票观察者和股票头寸跟踪器。
- transaction - 嵌入式帐户事务数据库,以多线程模式运行。
- 增值税- 增值税号验证和欧盟增值税税率。
回到顶部
形式
用于处理表单的库。
- bind - 将表单数据绑定到任何 Go 值。
- binding - 将来自 net/http 请求的表单和 JSON 数据绑定到结构。
- 符合- 检查用户输入。基于结构标签修剪、清理和清理数据。
- form - 将 url.Values 解码为 Go 值,并将 Go 值编码为 url.Values。双阵列和全地图支持。
- formam - 将表单的值解码为结构。
- forms - 与框架无关的库,用于解析和验证支持多部分表单和文件的表单/JSON 数据。
- gorilla/csrf - Go Web 应用程序和服务的 CSRF 保护。
- httpin - 将 HTTP 请求解码为自定义结构,包括查询字符串、表单、HTTP 标头等。
- nosurf -Go的 CSRF 保护中间件。
- qs - 用于将结构编码为 URL 查询参数的 Go 模块。
- queryparam - 解码url.Values为标准或自定义类型的可用结构值。
回到顶部
功能性
支持 Go 函数式编程的包。
- fpGo - Monad,Golang 的函数式编程特性。
- fuego -Go 中的功能实验。
- go-underscore - 有用的 Go 集合实用程序的有用集合。
- gofp - 一个类似于 lodash 的强大的 Golang 实用程序库。
- underscore -Go 1.18 及更高版本的函数式编程助手。
回到顶部
游戏开发
很棒的游戏开发库。
- Azul3D - 用 Go 编写的 3D 游戏引擎。
- Ebiten - Go 中死的简单 2D 游戏库。
- engo - Engo 是一个用 Go 编写的开源 2D 游戏引擎。它遵循实体-组件-系统范式。
- g3n - Go 3D 游戏引擎。
- go-astar - A* 路径查找算法的 Go 实现。
- go-sdl2 -简单 DirectMedia 层的 Go 绑定。
- go3d -Go的面向性能的 2D/3D 数学包。
- gott - 使用 golang 实现的游戏服务器骨架。
- goworld - 可扩展的游戏服务器引擎,具有空间实体框架和热交换。
- Leaf - 轻量级游戏服务器框架。
- nano - 轻量级、便利、高性能的基于 golang 的游戏服务器框架。
- Oak - 纯围棋游戏引擎。
- Pitaya - 通过 C SDK 为 iOS、Android、Unity 等提供集群支持和客户端库的可扩展游戏服务器框架。
- Pixel - Go 中手工制作的 2D 游戏库。
- 原型- 使用最小 API 创建桌面游戏的跨平台(Windows/Linux/Mac)库。
- raylib-go - raylib的Go 绑定,一个简单易用的库,用于学习视频游戏编程。
- termloop - 基于终端的围棋游戏引擎,建立在 Termbox 之上。
- tile - 面向数据和缓存友好的 2D 网格库 (TileMap),包括寻路、观察器和导入/导出。
回到顶部
发电机
生成 Go 代码的工具。
- efaceconv - 用于从 interface{} 高性能转换为不可变类型的代码生成工具,无需分配。
- gen - 类似“泛型”功能的代码生成工具。
- generis - 提供泛型、自由格式宏、条件编译和 HTML 模板的代码生成工具。
- go-enum - 从代码注释中生成枚举的代码。
- go-linq - 用于 Go 的 .NET 类似 LINQ 的查询方法。
- go-xray - 帮助更轻松地使用反射。
- goderive - 从输入类型派生函数。
- gotype - Golang 源代码解析,用法如反射包。
- goverter - 通过定义接口生成转换器。
- GoWrap - 使用简单的模板为 Go 接口生成装饰器。
- interfaces - 用于生成接口定义的命令行工具。
- jennifer - 无需模板即可生成任意 Go 代码。
- pkgreflect - 用于包范围反射的预处理器。
- typeregistry - 动态创建类型的库。
回到顶部
地理
地理工具和服务器
- geoserver -geoserver 是一个 Go 包,用于通过 GeoServer REST API 操作 GeoServer 实例。
- gismanager - 将您的 GIS 数据(矢量数据)发布到 PostGIS 和 Geoserver.
- godal - GDAL 的包装器。
- mbtileserver - 一个简单的基于 Go 的服务器,用于以 mbtiles 格式存储的地图图块。
- osm - 用于读取、写入和使用 OpenStreetMap 数据和 API 的库。
- pbf - OpenStreetMap PBF golang 编码器/解码器。
- S2 geojson - 将 geojson 转换为 s2 单元并在地图上展示一些 S2 几何特征。
- S2 几何- Go 中的 S2 几何库。
- simplefeatures - simplesfeatures 是一个 2D 几何库,它提供了对几何进行建模的 Go 类型,以及对其进行操作的算法。
- Tile38 - 具有空间索引和实时地理围栏的地理定位数据库。
- WGS84 - 坐标转换和转换库(ETRS89、OSGB36、NAD83、RGF93、Web Mercator、UTM)。
回到顶部
编译器
将 Go 编译成其他语言的工具。
- c4go - 将 C 代码转换为 Go 代码。
- esp32 - 转译进入 Arduino 代码。
- f4go - 将 FORTRAN 77 代码转换为 Go 代码。
- gopherjs - 从 Go 到 JavaScript 的编译器。
- tardisgo - Golang 到 Haxe 到 CPP/CSharp/Java/JavaScript 转译器。
回到顶部
协程
用于管理和使用 Goroutine 的工具。
- ants - Go 中高性能和低成本的 goroutine 池。
- artifex - Golang 的简单内存中作业队列,使用基于工作者的调度。
- async - Go 的替代同步库(Future,Promise,Locks)。
- async - 一种异步执行函数的安全方法,在出现恐慌时恢复它们。
- 断路器- 使执行流程可中断的灵活机制。
- channelify - 将您的函数转换为返回通道,以实现简单而强大的并行处理。
- concurrency-limiter - 并发限制器,支持超时、动态优先级和 goroutine 的上下文取消。
- conexec - 一个并发工具包,可帮助以高效和安全的方式同时执行函数。它支持指定整体超时以避免阻塞,并使用 goroutine 池来提高效率。
- cyclicbarrier -golang的 CyclicBarrier.
- execpool - 围绕 exec.Cmd 构建的池,可提前启动给定数量的进程,并在需要时将 stdin 和 stdout 附加到它们。与 FastCGI 或 Apache Prefork MPM 非常相似,但适用于任何命令。
- go-floc - 轻松编排 goroutine。
- go-flow - 控制 goroutine 的执行顺序。
- go-tools/multithreading - 使用这个轻量级库和一个简单的 API 来管理一个 goroutine 池。
- go-trylock - 对 Golang 读写锁的 TryLock 支持。
- go-waitgroup -sync.WaitGroup与错误处理和并发控制类似。
- go-workers - 轻松安全地运行大型数据处理管道的工作人员。
- goccm - Go 并发管理器包限制了允许并发运行的 goroutine 的数量。
- gohive - 用于 Go 的高性能且易于使用的 Goroutine 池。
- gollback - 异步简单函数实用程序,用于管理闭包和回调的执行。
- gowl - Gowl 是一个流程管理和流程监控工具。无限工作池使您能够控制池和进程并监控它们的状态。
- goworker - goworker 是一个基于 Go 的后台工作者。
- gowp - gowp 是并发限制 goroutine 池。
- gpool - 管理一个可调整大小的上下文感知 goroutine 池以绑定并发。
- grpool - 轻量级 Goroutine 池。
- hands - 一个进程控制器,用于控制多个 goroutine 的执行和返回策略。
- Hunch - Hunch 提供了如下函数:All, First,Retry等Waterfall,使异步流控制更加直观。
- kyoo - 提供无限的作业队列和并发工作池。
- neilotoole/errgroup - 的替代方案sync/errgroup,仅限于 N 个工作 goroutine 的池。
- 托儿所- Go 中的结构化并发。
- 监督- 监督是 Erlang 监督树的完整实现。
- parallel-fn - 并行运行函数。
- 池塘- 用 Go 编写的简约和高性能 goroutine 工作池。
- pool - 有限的消费者 goroutine 或无限的 goroutine 池,以便于 goroutine 处理和取消。
- queue - 为您提供sync.WaitGroup类似队列组的可访问性。帮助您限制和限制 goroutine,等待所有 goroutine 结束等等。
- 例程- 带上下文的例程控制,支持:Main、Go、Pool 和一些有用的 Executors。
- semaphore - 基于通道和上下文的锁定/解锁操作超时的信号量模式实现。
- semaphore - 基于 CAS 的快速可调整大小的信号量实现(比基于通道的信号量实现更快)。
- stl - 基于软件事务内存 (STM) 并发控制机制的软件事务锁。
- threadpool -Golang 线程池实现。
- tunny -golang 的 Goroutine 池。
- worker-pool -goworker 是一个 Go 简单的异步工作池。
- workerpool - 限制任务执行并发的 Goroutine 池,而不是排队的任务数量。
相互作用
图形用户界面
用于构建 GUI 应用程序的库。
工具包
- app - 使用 GO、HTML 和 CSS 创建应用程序的包。支持:MacOS、Windows 正在进行中。
- fyne - 基于 Material Design 为 Go 设计的跨平台原生 GUI。支持:Linux、macOS、Windows、BSD、iOS 和 Android。
- go-astilectron - 使用 GO 和 HTML/JS/CSS(由 Electron 提供支持)构建跨平台 GUI 应用程序.
- go-gtk - GTK 的 Go 绑定。
- go-sciter -Sciter的 Go 绑定:用于现代桌面 UI 开发的可嵌入 HTML/CSS/脚本引擎. 跨平台。
- gotk3 - GTK3 的 Go 绑定。
- 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 绑定(Windows / macOS / Linux)的跨平台 webview 窗口。
相互作用
- go-appindicator - libappindicator3 C 库的 Go 绑定。
- gosx-notifier -Go 的OSX 桌面通知库。
- mac-activity-tracker - OSX 库,用于通知您机器上的任何(可插入)活动。
- mac-sleep-notifier -golang 中的 OSX 睡眠/唤醒通知.
- robotsgo - Go Native 跨平台 GUI 系统自动化。控制鼠标、键盘等。
- systray - 跨平台 Go 库,用于在通知区域放置图标和菜单。
- Trayhost - 跨平台 Go 库,用于在主机操作系统的任务栏中放置图标。
- zenity - 跨平台 Go 库和 CLI,用于创建与用户进行图形交互的简单对话框。
回到顶部
硬件
用于与硬件交互的库、工具和教程。
- arduino-cli - 官方 Arduino CLI 和库。可以独立运行,也可以合并到更大的 Go 项目中。
- emgo - 用于编程嵌入式系统(例如 STM32 MCU)的类似 Go 的语言。
- ghw - Golang 硬件发现/检查库。
- go-osc -Go 的开放声音控制(OSC)绑定。
- go-rpio -Go 的GPIO,不需要 cgo。
- goroslib -Go 的机器人操作系统(ROS)库。
- 操纵杆- 一个轮询 API,用于读取附加操纵杆的状态。
- sysinfo - 一个纯 Go 库,提供 Linux 操作系统/内核/硬件系统信息。
回到顶部
图片
用于处理图像的库。
- bild - 纯 Go 中图像处理算法的集合。
- bimg - 使用 libvips 进行快速高效图像处理的小包。
- cameron - Go 的头像生成器。
- canvas - 将矢量图形转换为 PDF、SVG 或光栅化图像。
- darkroom - 具有可变存储后端和图像处理引擎的图像代理,专注于速度和弹性。
- Draft - 使用简单的 YAML 语法为 GraphViz 生成高级微服务架构图。
- geopattern - 从字符串创建漂亮的生成图像模式。
- gg - 纯 Go 中的 2D 渲染。
- 礼物- 图像处理过滤器包。
- gltf - 高效且强大的 glTF 2.0 阅读器、编写器和验证器。
- go-cairo - cairo 图形库的 Go 绑定。
- go-gd - GD 库的 Go 绑定。
- go-nude - 使用 Go 进行裸体检测。
- go-opencv - OpenCV 的 Go 绑定。
- go-webcolors - 从 Python 到 Go 的 webcolors 库的端口。
- go-webp - 使用 libwebp 对 webp 图片进行编码和解码的库。
- gocv - 使用 OpenCV 3.3+ 的计算机视觉 Go 包。
- goimagehash - Go 感知图像散列包。
- goimghdr - imghdr 模块确定 Go 文件中包含的图像类型。
- govatar - 用于生成有趣头像的库和 CMD 工具。
- govips - 用于 Go 的闪电般快速的图像处理和大小调整库。
- gowitness - 在命令行上使用 go 和 headless chrome 截屏网页。
- gridder - 基于网格的 2D 图形库。
- 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 中调整图像大小。
- scout -Scout 是一个独立的开源软件解决方案,用于 DIY 视频安全。
- smartcrop - 为任意图像和裁剪尺寸找到好的裁剪。
- steganography - LSB 隐写术的纯 Go 库.
- stegify - 用于 LSB 隐写术的 Go 工具,能够隐藏图像中的任何文件。
- svgo - 用于 SVG 生成的 Go 语言库。
- tga - 包 tga 是一个 TARGA 图像格式解码器/编码器。
- webp-server - 简单且最小的图像服务器,能够存储、调整大小、转换和缓存图像。
回到顶部
物联网(物联网)
用于物联网设备编程的库。
- connectordb - 量化自我和物联网的开源平台。
- devices - 物联网设备的库套件,x/exp/io 的实验性.
- eywa - Project Eywa 本质上是一个连接管理器,用于跟踪连接的设备。
- flogo -Flogo项目是 IoT Edge 应用程序和集成的开源框架。
- gatt -Gatt 是用于构建低功耗蓝牙外围设备的 Go 包。
- gobot - Gobot 是机器人、物理计算和物联网的框架。
- huego - 适用于 Go 的广泛的飞利浦 Hue 客户端库。
- iot - IoT 是一个用于实现 Google IoT Core 设备的简单框架。
- mainflux - 工业物联网消息和设备管理服务器。
- periph - 外设 I/O 与低级板设备接口。
- sensorbee - 用于 IoT 的轻量级流处理引擎。
回到顶部
作业调度程序
用于调度作业的库。
- cdule - 具有数据库支持的作业调度程序库
- 脸颊- 一个类似 crontab 的简单调度程序,旨在为作业调度提供 KISS 方法。
- clockwerk - 使用简单流畅的语法安排定期作业的 Go 包。
- cronticker - 一个支持 cron 计划的代码实现。
- go-cron - 用于 go 的简单 Cron 库,可以在特定日期和时间以不同的时间间隔执行闭包或函数,从每秒一次到每年一次。主要用于 Web 应用程序和长时间运行的守护进程。
- go-quartz -Go 的简单、零依赖调度库。
- gocron - 简单流畅的 Go 作业调度。这是jasonlvhit/gocron的一个积极维护的分支。
- goflow - 用于 ETL/ML/AI 管道快速原型设计的工作流编排器和调度器。
- gron - 使用简单的 Go API 定义基于时间的任务,Gron 的调度程序将相应地运行它们。
- gronx - Cron 表达式解析器,任务运行程序和使用 crontab 的守护程序,如任务列表。
- JobRunner - 智能且功能强大的 cron 作业调度程序,内置作业队列和实时监控。
- jobs - 持久且灵活的后台作业库。
- leprechaun - 支持 webhook、crons 和经典调度的作业调度程序。
- sched - 具有快进时间能力的作业调度程序。
- scheduler - Cronjobs 调度变得容易。
- tasks - 一个易于使用的进程内调度程序,用于 Go 中的重复任务。
回到顶部
JSON
用于处理 JSON 的库。
- ajson - 支持 JSONPath 的 golang 抽象 JSON。
- ask - 轻松访问地图和切片中的嵌套值。与 encoding/json 和其他将任意数据“解组”为 Go 数据类型的包结合使用。
- dynjson - 用于动态 API 的客户端可自定义 JSON 格式。
- ej - 简洁地从不同来源写入和读取 JSON。
- epoch - 包含用于编组/解组 Unix 时间戳/纪元到/从内置 time.Time 类型在 JSON 中的原语。
- fastjson - Go 的快速 JSON 解析器和验证器。没有自定义结构,没有代码生成,没有反射。
- gjo - 创建 JSON 对象的小工具。
- GJSON - 使用一行代码获取 JSON 值。
- go-jsonerror -Go-JsonError 允许我们轻松创建遵循 JsonApi 规范的 json 响应错误。
- go-respond - 用于处理常见 HTTP JSON 响应的 Go 包。
- gojq -Golang中的 JSON 查询。
- gojson - 从示例 JSON 中自动生成 Go (golang) 结构定义。
- JayDiff - 用 Go 编写的 JSON diff 实用程序。
- jettison - 用于 Go 的快速灵活的 JSON 编码器。
- jscan - 高性能零分配 JSON 迭代器。
- JSON-to-Go - 将 JSON 转换为 Go 结构。
- JSON-to-Proto - 在线将 JSON 转换为 Protobuf.
- json2go - 高级 JSON 到 Go 结构转换。提供可以解析多个 JSON 文档并创建适合它们的结构的包。
- jsonapi-errors - 基于 JSON API 错误参考的 Go 绑定。
- jsoncolor - 用于encoding/json输出彩色 JSON 的直接替换。
- jsondiff - 基于 RFC6902(JSON 补丁)的 Go 的 JSON 差异库。
- jsonf - 用于突出显示格式和获取 JSON 的结构查询的控制台工具。
- jsongo - 流利的 API,可以更轻松地创建 Json 对象。
- jsonhal - 简单的 Go 包,用于将自定义结构编组为 HAL 兼容的 JSON 响应。
- json - 用于处理和查询 JSON 的实用程序,无需以类型安全的方式定义结构。
- jzon - 具有标准兼容 API/行为的 JSON 库。
- kazaam - 用于 JSON 文档任意转换的 API。
- mapslice-json - 使用 MapSlice 以 JSON 格式对地图进行有序编组/解组。
- mp - 简单的 cli 电子邮件解析器。它目前采用标准输入并输出 JSON。
- OjG - 为 Go 优化的 JSON 是一种高性能解析器,具有各种附加的 JSON 工具,包括 JSONPath。
- omg.jsonparser - 简单的 JSON 解析器,通过 golang 结构字段标签进行条件验证。
- ujson - 适用于非结构化 JSON 的快速且最小的 JSON 解析器和转换器。
- vjson - 用于通过流式 API 声明 JSON 模式来验证 JSON 对象的 Go 包。
回到顶部
日志记录
用于生成和使用日志文件的库。
- distillog - 提炼的水平日志记录(将其视为 stdlib + 日志级别)。
- glg -glg 是用于 Go 的简单快速的分级日志库。
- glo - 具有相同严重级别的受 PHP Monolog 启发的日志记录工具。
- glog -Go的分级执行日志。
- go-cronowriter - 根据当前日期和时间自动轮换日志文件的简单编写器,如 cronolog。
- go-log - 带有 strack 跟踪、对象转储和可选时间戳的日志库。
- go-log - 简单且可配置的 Go 日志记录,具有级别、格式化程序和编写器。
- go-log - 日志库支持级别和多处理程序。
- go-log -Go 中的 Log4j 实现。
- go-logger - Go 程序的简单记录器,带有级别处理程序。
- gologger - 简单易用的 go 日志库,登录彩色控制台、简单控制台、文件或 Elasticsearch.
- gomol - 具有可扩展日志输出的 Go 多输出结构化日志记录。
- got/log - 快速、可扩展、功能齐全、std-lib 源代码兼容的日志库。
- httpretty - 在终端上漂亮地打印您的常规 HTTP 请求以进行调试(类似于 http.DumpRequest)。
- journald - 执行 systemd Journal 的本地日志记录 API。
- kemba - 受debug启发的小型调试日志记录工具,非常适合 CLI 工具和应用程序。
- log - 一个 O(1) 日志系统,允许您将一个日志连接到多个写入器(例如 stdout、一个文件和一个 TCP 连接)。
- log - Go 的结构化日志记录包。
- log - 简单、可配置和可扩展的 Go 结构化日志记录。
- log - Go 的结构化日志接口将日志记录外观与其实现完全分开。
- log-voyage - 用 golang 编写的全功能日志记录 saas。
- log15 - 简单、强大的 Go 日志记录。
- logdump - 用于多级日志记录的包。
- logex -Golang 日志库,支持跟踪和级别,由标准日志库包装。
- logger - Go 的简约日志库。
- logmatic - 具有动态日志级别配置的 Golang 彩色记录器。
- logo - Golang 记录器到不同的可配置编写器。
- logrus -Go的结构化记录器。
- logrusiowriter -io.Writer使用logrus记录器实现。
- logrusly - logrus插件将错误发送到Loggly。
- logur - 一个自以为是的记录器接口和记录最佳实践的集合,带有适配器和知名库(logrus、go-kit log、zap、zerolog等)的集成。
- logutils - 用于在 Go (Golang) 中更好地登录的实用程序,扩展了标准记录器。
- logxi - 12 因素应用程序记录器,速度快,让您开心。
- lumberjack - 简单的滚动记录器,实现 io.WriteCloser.
- mlog - 用于 go 的简单日志记录模块,具有 5 个级别,可选的旋转日志文件功能和 stdout/stderr 输出。
- noodlog - 参数化 JSON 日志库,可让您混淆敏感数据并编组任何类型的内容。没有更多的打印指针而不是值,也没有 JSON 字符串的转义字符。
- onelog - Onelog 是一个非常简单但非常高效的 JSON 记录器。它是所有场景中最快的 JSON 记录器。此外,它是分配最低的记录器之一。
- ozzo-log - 支持日志严重性、分类和过滤的高性能日志记录。可以将过滤后的日志消息发送到各种目标(例如控制台、网络、邮件)。
- phuslu/log - 结构化日志记录变得容易。
- rollingwriter - RollingWriter 是一种自动轮换io.Writer实现,具有多种策略来提供日志文件轮换。
- seelog - 具有灵活调度、过滤和格式化的日志记录功能。
- spew - 为 Go 数据结构实现一个深度漂亮的打印机以帮助调试。
- sqldb-logger - Go SQL 数据库驱动程序的记录器,无需修改现有的 *sql.DB stdlib 使用。
- stdlog -Stdlog 是一个面向对象的库,提供分级日志记录。它对 cron 作业非常有用。
- structy/log - 一个简单易用的日志系统,简约但具有调试和区分消息的功能。
- tail - 努力模仿 BSD tail 程序功能的 Go 包。
- xlog - Go 的插件架构和灵活的日志系统,具有级别 ctrl、多个日志目标和自定义日志格式。
- xlog - 结构化记录器,用于net/context具有灵活调度的感知 HTTP 处理程序。
- 叫喊- 另一个简约的日志库。
- zap - Go 中快速、结构化、分级的日志记录。
- zerolog - 零分配 JSON 记录器。
- zkits-logger - 一个强大的零依赖 JSON 记录器。
回到顶部
机器学习
机器学习库。
- bayesian -Golang的朴素贝叶斯分类。
- CloudForest - 快速、灵活、多线程的决策树集合,用于纯 Go 中的机器学习。
- ddt - 动态决策树,创建定义可定制规则的树。
- eaopt - 进化优化库。
- evoli - 遗传算法和粒子群优化库。
- fonet - 用 Go 编写的深度神经网络库。
- go-cluster - k-modes 和 k-prototypes 聚类算法的 Go 实现。
- go-deep -Go 中功能丰富的神经网络库。
- go-fann - 快速人工神经网络(FANN)库的 Go 绑定。
- go-featureprocessing -Go中用于低延迟机器学习的快速便捷的特征处理。
- go-galib - 用 Go / golang 编写的遗传算法库。
- go-pr -Go 语言中的模式识别包。
- gobrain - 用 go 编写的神经网络。
- godist - 各种概率分布和相关方法。
- goga -Go的遗传算法库。
- GoLearn - Go 的通用机器学习库。
- golinear -Go 的 liblinear 绑定。
- GoMind - Go 中一个简单的神经网络库。
- goml -Go中的在线机器学习。
- gott -Go的神经网络。
- Goptuna - 用 Go 编写的黑盒函数的贝叶斯优化框架。一切都会被优化。
- goRecommend - 用 Go 编写的推荐算法库。
- gorgonia - 基于图形的计算库,如 Go 的 Theano,提供用于构建各种机器学习和神经网络算法的原语。
- gorse - 基于 Go 编写的协同过滤的离线推荐系统后端。
- goscore - 用于 PMML 的 Go 评分 API。
- gosseract - 用于 OCR(光学字符识别)的 Go 包,使用 Tesseract C++ 库。
- libsvm - 基于 LIBSVM 3.14 的 libsvm golang 版本派生工作。
- m2cgen - 一个 CLI 工具,用于将经过训练的经典 ML 模型转换为具有零依赖关系的本机 Go 代码,用 Python 编写并支持 Go 语言。
- 整洁- 用于增强拓扑神经进化(NEAT)的即插即用并行 Go 框架.
- neural-go - 用 Go 实现的多层感知器网络,通过反向传播进行训练。
- ocrserver - 一个简单的 OCR API 服务器,非常容易被 Docker 和 Heroku 部署。
- onnx-go - 开放神经网络交换 (ONNX) 的 Go 接口。
- probab - 概率分布函数。贝叶斯推理。用纯 Go 编写。
- randomforest - 易于使用的 Go 随机森林库。
- regommend - 推荐和协同过滤引擎。
- shield - 具有灵活标记器和 Go 存储后端的贝叶斯文本分类器。
- tfgo - 易于使用的 Tensorflow 绑定:简化了官方 Tensorflow Go 绑定的使用。在 Go 中定义计算图,加载和执行用 Python 训练的模型。
- Varis - Golang 神经网络。
回到顶部
消息传递
实现消息系统的库。
- ami - 将客户端转到基于 Redis Cluster Streams 的可靠队列。
- amqp - 转到 RabbitMQ 客户端库。
- APNs2 - 适用于 Go 的 HTTP/2 Apple 推送通知提供程序 - 向 iOS、tvOS、Safari 和 OSX 应用程序发送推送通知。
- Asynq - 一个简单、可靠、高效的 Go 分布式任务队列,构建在 Redis 之上。
- Beaver - 一个实时消息服务器,用于构建可扩展的应用内通知、多人游戏、网络和移动应用中的聊天应用。
- Benthos - 一系列协议之间的消息流桥。
- Bus - 用于内部通信的极简主义消息总线实现。
- Centrifugo -Go 中的实时消息传递(Websockets 或 SockJS)服务器。
- Chanify - 推送通知服务器向您的 iOS 设备发送消息。
- Commander - 高级事件驱动的消费者/生产者,支持各种“方言”,例如 Apache Kafka。
- Confluent Kafka Golang 客户端- confluent-kafka-go 是 Confluent 的 Golang 客户端,用于 Apache Kafka 和 Confluent 平台。
- dbus - D-Bus 的本机 Go 绑定。
- drone-line -使用二进制、docker 或 Drone CI发送Line通知。
- 发射器- 使用 Go 方式发出事件,具有通配符、谓词、取消可能性和许多其他好的胜利。
- event - 模式观察者的实现。
- EventBus - 具有异步兼容性的轻量级事件总线。
- gaurun-client - 用 Go 编写的 Gaurun 客户端。
- Glue - 强大的 Go 和 Javascript 套接字库(Socket.io 的替代品)。
- go-mq - 具有声明性配置的 RabbitMQ 客户端。
- go-notify -freedesktop 通知规范的本机实现。
- go-nsq - NSQ 的官方 Go 包。
- go-res - 使用 NATS 和 Resgate 构建客户端无缝同步的 REST/实时服务的包。
- go-socket.io -golang的 socket.io 库,一个实时应用程序框架。
- go-vitotrol - Viessmann Vitotrol Web 服务的客户端库。
- Gollum - 一个 n:m 多路复用器,它从不同来源收集消息并将它们广播到一组目的地。
- golongpoll - HTTP longpoll 服务器库,使 web pub-sub 变得简单。
- gopush-cluster -gopush-cluster 是一个 go push 服务器集群。
- gorush - 使用APNs2和 google GCM推送通知服务器。
- gosd - 用于调度何时向频道发送消息的库。
- guble - 使用推送通知(Google Firebase 云消息传递、Apple 推送通知服务、SMS)以及 websockets(一种 REST API)的消息传递服务器,具有分布式操作和消息持久性。
- hare - 一个用户友好的库,用于发送消息和侦听 TCP 套接字。
- hub - Go 应用程序的消息/事件中心,使用发布/订阅模式,支持 rabbitMQ 交换等别名。
- jazz - 一个简单的 RabbitMQ 抽象层,用于队列管理以及消息的发布和消费。
- machine - 基于分布式消息传递的异步任务队列/作业队列。
- mangos - 具有传输互操作性的 Nanomsg(“可扩展性协议”)的纯 go 实现。
- melody - 处理 websocket 会话的极简框架,包括广播和自动 ping/pong 处理。
- Mercure - 使用 Mercure 协议(构建在服务器发送事件之上)调度服务器发送更新的服务器和库。
- messagebus - messagebus 是一个 Go 简单的异步消息总线,非常适合在进行事件溯源、CQRS、DDD 时用作事件总线。
- NATS Go Client - 轻量级和高性能的发布-订阅和分布式队列消息系统 - 这是 Go 库。
- nsq-event-bus - 一个围绕 NSQ 主题和频道的小型包装器。
- oplog - 用于 REST API 的通用 oplog/复制系统。
- pubsub - 简单的 pubsub 包。
- rabbus - amqp 交换和队列的小型包装器。
- rabtap -RabbitMQ瑞士军刀 cli 应用程序。
- RapidMQ - RapidMQ 是一个轻量级且可靠的库,用于管理本地消息队列。
- redisqueue - redisqueue 提供了使用 Redis 流的队列的生产者和消费者。
- rmqconn - RabbitMQ 重新连接。amqp.Connection 和 amqp.Dial 的包装器。允许在连接断开时重新连接,然后强制关闭对 Close() 方法的调用。
- sarama - Apache Kafka 的 Go 库。
- Uniqush-Push - Redis 支持的统一推送服务,用于向移动设备发送服务器端通知。
- zmq4 - 转到 ZeroMQ 版本 4 的接口。也可用于版本 3和版本 2。
回到顶部
微软办公软件
- unioffice - 用于创建和处理 Office Word (.docx)、Excel (.xlsx) 和 Powerpoint (.pptx) 文档的纯 go 库。
微软Excel
用于使用 Microsoft Excel 的库。
- excelize - 用于读取和写入 Microsoft Excel™ (XLSX) 文件的 Golang 库。
- go-excel - 一个简单轻巧的阅读器,可以将类似相关 db 的 excel 作为表格读取。
- goxlsxwriter - 用于编写 XLSX(Microsoft Excel)文件的 libxlsxwriter 的 Golang 绑定。
- xlsx - 用于简化读取最新版本 Microsoft Excel 在 Go 程序中使用的 XML 格式的库。
- xlsx - 在 Go 程序中读取/更新现有 Microsoft Excel 文件的快速且安全的方法。
回到顶部
各种各样的
依赖注入
用于依赖注入的库。
- alice - Golang 的附加依赖注入容器。
- container - 一个强大的 IoC 容器,具有流畅且易于使用的界面。
- di - Go 编程语言的依赖注入容器。
- dig - 一个基于反射的 Go 依赖注入工具包。
- dingo - 基于 Guice 的 Go 依赖注入工具包。
- fx - 一个基于依赖注入的 Go 应用程序框架(建立在 dig 之上)。
- gocontainer - 简单的依赖注入容器。
- goioc/di - 受 Spring 启发的依赖注入容器。
- google/wire -Go 中的自动初始化。
- HnH/di - 专注于清洁 API 和灵活性的 DI 容器库。
- kinit - 具有全局模式、级联初始化和恐慌安全终结的可定制依赖注入容器。
- 链接器- 基于反射的依赖注入和具有组件生命周期支持的控制库反转。
- nject - 用于库、测试和 http 端点以及服务启动的类型安全、反射框架。
- wire -Golang 的严格运行时依赖注入。
回到顶部
项目布局
用于构建项目的非官方模式集。
- ardanlabs/service -用于构建生产级可扩展 Web 服务应用程序的入门工具包。
- cookiecutter-golang - 一个 Go 应用程序样板模板,用于按照生产最佳实践快速启动项目。
- go-sample - 带有真实代码的 Go 应用程序项目的示例布局。
- go-starter - 一个自以为是的生产就绪 RESTful JSON 后端模板,与 VSCode DevContainers 高度集成。
- go-todo-backend - 使用产品微服务的模块化项目布局的 Go Todo 后端示例.
- gobase - 一个简单的 golang 应用程序框架,具有真正的 golang 应用程序的基本设置。
- golang-standards/project-layout -Go 生态系统中一组常见的历史和新兴项目布局模式。注意:尽管 org-name 不代表官方 golang 标准,请参阅此问题以获取更多信息。尽管如此,有些人可能会发现布局很有用。
- golang-templates/seed - Go 应用程序 GitHub 存储库模板。
- insidieux/inizio - 带有插件的 Golang 项目布局生成器。
- modern-go-application -Go 应用程序样板和应用现代实践的示例。
- pagoda -Go 中内置的快速、简单的全栈 Web 开发入门套件。
- 脚手架- 脚手架生成一个入门 Go 项目布局。让您专注于实现的业务逻辑。
- wangyoucao577/go-project-layout - 关于如何构建 Go 项目布局的一组实践和讨论。
回到顶部
字符串
用于处理字符串的库。
- bexp - 大括号扩展机制的 Go 实现以生成任意字符串。
- go-formatter - 实现由大括号格式字符串包围的替换字段。{}
- gobeam/Stringy - 字符串操作库,用于将字符串转换为驼峰式、蛇式、烤肉串式 / slugify 等。
- strutil - 字符串实用程序。
- sttr - 跨平台的 cli 应用程序,用于对字符串执行各种操作。
- xstrings - 从其他语言移植的有用字符串函数的集合。
go语言适合做什么(go语言适合做嵌入式开发吗)3
最近一年,将 Rust 和 Go 进行比较的不少,但不少都不公正,带感情色彩。而这篇文章客观、全面的分析对比了 Rust 和 Go,让你具体项目时选择最合适的。
Rust 还是 Go,哪个更好?你应该为下一个项目选择哪种语言,为什么?两者在性能,简单性,安全性,功能,规模和并发性等方面如何比较?它们有什么共同点,并且在根本上有何不同?来自 For the Go of Love[1] 系列图书的作者,友好而公正的比较 Rust 和 Golang。
Rust 和 Go 都很棒
首先,非常重要的一点是,Go 和 Rust 都是绝对优秀的编程语言。它们是现代的,强大的,被广泛采用的,并且具有出色的性能。你可能已经阅读了一些文章和博客文章,目的是说服 Go 比 Rust 更好,反之亦然。但这确实没有道理;每种编程语言都代表一组权衡。每种语言针对不同的事物进行了优化,因此,应根据适合你的语言以及你要解决的问题来确定语言的选择。
在本文中,我将简要概述我认为 Go 是理想的选择,以及我认为 Rust 是更好的选择的地方。不过,理想情况下,你应该对这两种语言都有一定的了解。尽管它们的语法和样式差异很大,但 Rust 和 Go 都是用于构建软件的一流工具。话虽如此,让我们仔细看看这两种语言。
相似之处
Rust 和 Go 有很多共同点,这是你经常听到他们一起被提及的原因之一。两种语言的共同目标是什么?
Rust 是一种专注于安全性和性能的低级静态类型多范式编程语言。—Gints Dreimanis[2]
Go 是一种开放源代码编程语言,可轻松构建简单,可靠和高效的软件。—Golang.org[3]
内存安全
Go 和 Rust 都属于优先考虑内存安全性的现代编程语言。数十年来,使用 C 和 C++ 等较旧的语言已经很清楚,导致错误和安全漏洞的最大原因之一是不安全或不正确地访问内存。Rust 和 Go 以不同的方式处理此问题,但是两者的目的都是要比其他有关内存管理的语言更聪明,更安全,并帮助你编写正确且性能良好的程序。
快速,紧凑的可执行文件
它们都是编译语言,这意味着你的程序直接转换为可执行的机器代码,因此你可以将程序作为单个二进制文件进行部署;与 Python 和 Ruby 等解释型语言不同,你无需随程序一起分发解释器,大量库和依赖项,这是一大优势。与解释型语言相比,这也使 Rust 和 Go 程序都非常快。
通用语言
Rust 和 Go 都是功能强大,可扩展的通用编程语言,你可以使用它们来开发各种现代软件,从Web应用程序到分布式微服务,或者从嵌入式微控制器到移动应用程序。两者都具有出色的标准库和蓬勃发展的第三方生态系统,以及强大的商业支持和庞大的用户群。它们都已经存在了很多年,并将在未来几年继续被广泛使用。今天学习 Go 或 Rust 将是你的时间和精力的明智投资。
务实(Pragmatic)的编程风格
两种语言都不是纯函数式语言(例如 Scala 或 Elixir),也不是全面面向对象的语言(例如 Java 和 C#)。相反,尽管 Go 和 Rust 都具有与函数和面向对象的编程相关的功能,但它们都是务实的语言,旨在以最合适的方式解决问题,而不是强迫你采用特定的处理方式。(不过,如果你喜欢函数式编程风格,则在 Rust 中会发现更多的函数式特性,因为 Rust 的函数式功能比 Go 多得多。)
我们可以讨论什么是“面向对象”语言,但是公平地说,Go 或 Rust 中都没有 C++,Java 或 C# 用户期望的面向对象编程风格。—Jack Mott
大规模发展
Rust 和 Go 都具有一些有用的特性,这使其适合于大型编程,包括大型团队,大型代码库,或两者兼而有之。
例如,尽管 C 程序员多年来一直在争论括号的位置,以及是否应使用制表符或空格使代码缩进,但 Rust 和 Go 都通过使用标准格式工具(gofmt 用于 Go ,rustfmt 用于 Rust)完全消除了此类问题。它使用规范样式自动格式化你的代码。并不是说这种特殊的样式本身如此出色:而是 Rust 和 Go 程序员所欣赏的标准化。
gofmt 的风格不是每个人的最爱,但 gofmt 是每个人的最爱。—Rob Pike[4]
两种语言得分很高的另一个领域是构建管道(build pipeline)。两者都具有出色的内置高性能标准构建和依赖管理工具。不再需要为复杂的第三方构建系统而费力,也不必每两年学习一次新的。
在我早期的职业生涯中,具有 Java 和 Ruby 背景的 Go 和 Rust 代码构建工作似乎使我无法承受。当我在 Google 时,遇到用 Go 编写的服务感到很欣慰,因为我知道它易于构建和运行。Rust 的情况也是如此,尽管我只是在较小的规模上进行了研究。我希望无限可配置的构建系统的日子已经一去不复返了,所有语言都附带了它们自己专用的构建工具,这些工具可以直接使用。—Sam Rose[5]
那有什么大惊小怪的?
考虑到所有这些,并且看到这两种语言的设计和功能如此强大,你可能想知道所有的圣战是关于什么的(我也是)。人们为什么对 “Go vs Rust” 如此大惊小怪,陷入愤怒的社交媒体争吵中,并写了很长的博客文章,内容涉及只有白痴才会使用Rust,或者 Go 不是真正的编程语言等等。它可能会让他们感觉更好,但对于试图决定要为项目使用哪种语言的人,或者应该学习哪种语言来促进编程事业的人,这并不能完全为你提供帮助。明智的人不会根据谁喊得最多而做出重要的选择。
现在,让我们继续探讨一些成年人在某些方面可能会比较喜欢一种语言而不是另一种语言的问题。
性能
我们已经说过,Go 和 Rust 都能生成非常快的程序,因为它们被编译为本机代码,而无需通过解释器或虚拟机。但是,Rust 的性能特别出色,它可与 C 和 C++ 相媲美(C/C++ 通常被认为是性能最高的编译语言),但与这些较旧的语言不同,它还提供了内存安全性和并发安全性,而执行速度却基本没有任何成本。Rust 还允许你创建复杂的抽象,而无需在运行时付出性能损失。
相比之下,尽管 Go 程序的性能也非常好,但是 Go 的主要目的是提高开发速度(包括编译),而不是提高执行速度。Go 编译器不会花费很多时间来尝试生成尽可能高效的机器代码;它更关心快速编译大量代码。因此,Rust 通常会在运行时基准测试中击败 Go。
Rust 的运行时性能也始终如一且可预测,因为它不使用垃圾回收。Go 的垃圾收集器非常高效,并且经过优化,可以使其 STW 的时间尽可能短(并且在每个新的 Go 版本中都变得更短)。但是垃圾回收不可避免地在程序的行为方式中引入了一些不可预测性,这在某些应用程序(例如嵌入式系统)中可能是一个严重的问题。
由于 Rust 旨在使程序员能够完全控制底层硬件,因此有可能将 Rust 程序优化为非常接近机器的最大理论性能。对于执行速度超过所有其他考虑因素的领域(例如游戏编程,操作系统内核,Web 浏览器组件和实时控制系统),Rust 使其成为绝佳的选择。
简单
如果没有人能弄清楚如何使用它,那么编程语言有多快也没关系。Go 被故意认为是对 C++ 等语言不断增长的复杂性的一种反应。它的语法很少,关键字也不多,而且功能也很少。这意味着学习 Go 语言并不需要很长时间,你可以在其中编写有用的程序。
Go 非常容易学习。我知道这是一个经常被吹捧的好处,但是我对能够这么快地提高生产力感到非常惊讶。多亏了语言,文档和工具,我实际上在两天之后就编写了有趣的,可提交的代码。— Rust 程序员对 Go 的早期印象[6]
这里的关键词是简单。当然,简单(simple)与容易(easy)并不相同,但是简单的小型语言比复杂的大型语言更容易学习。要做的事情没有太多不同的方式,因此所有编写良好的 Go 代码看起来都一样。深入研究不熟悉的服务并了解其功能很容易。
fmt.Println("Gopher's Diner Breakfast Menu")
for dish, price := range menu {
fmt.Println(dish, price)
}
尽管核心语言很小,但 Go 的标准库功能非常强大。这意味着你的学习曲线还需要包括所需的标准库部分,而不仅仅是Go语法。另一方面,将功能从语言中移出并移入标准库意味着你现在可以专注于仅学习与你相关的库。
Go 还被设计用于具有大型代码库和大型团队的大规模软件开发。在这种情况下,重要的是,新开发人员必须尽快上手。
使用 Go,你可以快速完成工作。Go 是我使用过的最具生产力的语言之一。口头禅是:解决今天的实际问题。—Matthias Endler[7]
特性
与其他几种编程语言相比,Rust 支持更多的复杂特性,因此,你可以用它实现更多的功能。例如,它支持泛型。—Devathon[8]
Rust 专门设计为包含许多强大而有用的功能,以帮助程序员以最少的代码完成最多的工作。例如,Rust 的 match 功能使你可以非常简洁地编写灵活的表达逻辑:
fn is_prime(n: u64) -> bool {
match n {
0...1 => false,
_ => !(2..n).any(|d| n % d == 0),
}
}
由于 Rust 的功能很多,这意味着有很多东西要学习,尤其是在一开始的时候。但这没关系:在 C++ 或 Java 中也有很多东西要学习,而且你没有获得 Rust 附带的高级功能,例如内存安全性。批评 Rust 是一种复杂的语言,没有抓住重点:它被设计成具有表现力,这意味着具有许多功能,并且在许多情况下,这是编程语言所需要的。当然,这是一条学习曲线,但是一旦你开始使用它,就可以了。
Rust 为准备接受更复杂的语法和语义(可能会带来更高的可读性成本)以换取最大可能的性能的程序员,与 C++ 和 D 竞争思想共享。—Dave Cheney[9]
并发
大多数语言都对并发编程提供某种形式的支持(一次执行多项操作),但是 Go 是专为这项工作而设计的。Go 不使用操作系统线程,而是提供了一种轻量级的替代方案:goroutines。每个 goroutine 是一个独立执行的 Go 函数,Go 调度程序会将其映射到其控制下的 OS 线程之一。这意味着调度程序仅使用有限数量的 OS 线程即可非常有效地管理大量并发的goroutine。
因此,你可以在一个程序中运行数百万个并发 goroutine,而不会造成严重的性能问题。这使 Go 成为 Web 服务器和微服务等大规模并发应用程序的理想选择。
Go 还提供了快速,安全,有效的方式,goroutine 使用 channel 进行通信和共享数据。Go 的并发支持设计良好,使用起来很愉快。通常很难对并发程序进行推理,而构建可靠,正确的并发程序对任何语言都是一个挑战。但是,由于它是从一开始就内置在语言中的,而不是事后才想到的,Go 中的并发编程简单、合理、良好的集成进语言中。
Go 使构建易于分解的应用程序变得非常容易,该应用程序在作为一组微服务部署时充分利用了并发性。Rust 也可以做这些事情,但是可以说有点困难。从某些方面来说,Rust 对防止与内存相关的安全漏洞的痴迷意味着程序员必须竭尽全力来执行使用其他语言(包括 Go)更简单的任务。—Sonya Koptyev[10]
相比之下,Rust 中的并发是一个很新的特性,并且还有待稳定中,但是它的发展非常活跃,因此请留意这块。例如,Rust 的 rayon[11] 提供了一种非常优雅且轻巧的方法,可以将顺序计算转换为并行计算。
具有轻量级 Goroutine 和 Channel 语法确实很棒。它确实显示出语法的威力,即如此小的细节使并发编程比其他语言感觉更好。— Rust 程序员对 Go 的早期印象[12]
虽然在 Rust 中实现并发程序可能会不太直接,但仍然可以实现,并且这些程序可以利用 Rust 的安全保证。标准库的 Mutex 类就是一个很好的例子:在 Go 中,你可以忘记在访问某些东西之前先获得一个互斥锁,但是 Rust 不允许你这样做。
Go 将并发作为第一类概念。这并不是说你无法在 Rust 中找到类似 Go 的并发方式,而是留给程序员练习。—Dave Cheney[13]
安全性
前面我们已经看到,Go 和 Rust 都以不同的方式来防止与内存管理有关的大量常见编程错误。但是,尤其是 Rust 会竭尽全力确保你不会做本不该做的不安全的事情。
Rust 的程序编辑器非常严格且学究(pedantic),它会检查你使用的每个变量以及引用的每个内存地址。它避免了可能的数据争用情况,并通知你有关未定义行为的信息。从根本上讲,并发和内存安全问题根本不可能进入Rust的安全子集。—Why Rust?[14]
这会使 Rust 中的编程成为几乎所有其他语言的不同体验,而且一开始可能具有挑战性。但对很多人来说,努力工作是值得的。
对我来说,Rust 的主要优点是感觉编译器成为我的靠山,不会让任何错误漏出(有时感觉像魔术)。—Grzegorz Nosek
包括 Go 在内的许多语言都具有帮助程序员避免错误的功能,但是 Rust 将其提升到了一个新的高度,因此潜在的错误程序甚至无法编译。
使用 Rust,库程序员可以使用很多工具来防止用户犯错误。Rust 使我们能够说我们拥有特定的数据。其他任何人都不可能拥有所有权,因此我们知道其他任何人都无法对其进行修改。我想不到曾经有过这么多工具来防止意外滥用。真是太好了。—Sam Rose[15]
对于新手 Rust 程序员来说,“与借阅检查器(borrow checker)打架”是一个常见的症状,但是在大多数情况下,它发现的问题是代码中的真正错误(或至少是潜在的错误)。这可能会迫使你从根本上重新架构程序,以避免遇到这些问题。当正确性和可靠性是你的重中之重时,这是一件好事。语言不会改变编程方式的重点是什么?当你使用其他语言工作时,Rust 讲授的有关安全性的课程也会很有用。
如果选择 Rust,通常需要该语言提供的保证:防止空指针和数据竞争的安全性,可预测的运行时行为以及对硬件的完全控制。如果你不需要这些功能,Rust 对于你的下一个项目可能不是一个好的选择。这是因为这些保证要付出一定的代价:学习坡度,时间问题。你将需要学习不良习惯并学习新概念。很有可能,刚开始时,你将与借阅检查器进行很多斗争。—Matthias Endler[16]
你发现 Rust 的编程模型的挑战性可能取决于你以前在其他语言中所拥有的经验。Python 或 Ruby 程序员可能会发现它有限制;而其他人可能很高兴。
如果你是一位花了数周时间寻找这些语言的内存安全性错误的 C 或 C++ 程序员,那么你将非常感谢 Rust。“对抗借阅检查器”变为“编译器可以检测到吗?凉!”—Grzegorz Nosek
规模
当今的服务器程序包含数千万行代码,由成百上千的程序员进行处理,并且每天都会更新。Go 的设计和开发旨在提高在这种环境下的工作效率。Go 的设计考虑因素包括严格的依赖关系管理,随着系统增长的软件体系结构的适应性以及跨组件边界的鲁棒性。—Rob Pike[17]
当你自己或以小组形式处理问题时,选择简单语言还是丰富语言是你的偏爱。但是随着软件变得越来越大,越来越复杂,以及团队越来越大,这种差异真正开始显现出来。对于大型应用程序和分布式系统,执行速度不如开发速度重要:像 Go 这样的故意最小化的语言减少了新开发人员的启动时间,并使他们更容易使用大型代码库。
使用 Go,初级开发人员更容易提高工作效率,而中级开发人员更难引入脆弱的抽象,而抽象将导致问题。由于这些原因,Rust 在企业软件开发方面不如 Go 引人注目。—Loris Cro[18]
当涉及到大型软件开发时,清晰胜于灵活。Go 的限制性实际上使它比 Rust 等更复杂、功能更强大的语言更适合企业和大型组织。
差异
尽管 Rust 和 Go 都是流行的,现代的,广泛使用的语言,但从故意针对完全不同的用例的意义上来说,它们并不是真正的竞争对手。Go 的整个编程方法与 Rust 的方法完全不同,每种语言都适合某些人,同时又会激怒其他人。绝对很好,而且如果 Rust 和 Go 都以或多或少相同的方式或多或少地完成了相同的事情,那么我们实际上就不需要两种不同的语言。
那么,通过发现它们采取截然不同的方法的问题,我们是否能够了解 Rust 和 Go 的各自性质?让我们找出答案。
垃圾回收
“进行垃圾收集或不进行垃圾收集”是没有正确答案的问题之一。垃圾回收和自动内存管理通常使开发可靠,高效的程序变得快速简便,对于某些人来说,这是必不可少的。但是其他人说,垃圾回收的性能开销和停顿,使程序在运行时无法正常运行,并引入了无法接受的延迟。争论不休。
Go 与 Rust 完全不同。尽管两者都可以模糊地描述为系统语言或 C 语言的替代品,但它们具有不同的目标和应用,语言设计风格以及优先级。垃圾收集确实是一个巨大的区别。在 Go 中使用 GC 可使该语言变得更加简单和小巧。
在 Rust 中不使用 GC 可以使它真正更快(特别是如果你需要保证的等待时间,而不仅仅是高吞吐量),并启用 Go 中无法实现的特性和编程模式(或者至少在不牺牲性能的情况下)。—PingCAP[19]
更接近金属(Close to the metal)
计算机编程的历史一直是一个越来越复杂的抽象的故事,它使程序员能够解决问题而不必担心底层机器的实际工作原理。这使程序更易于编写,并且可能更具移植性。但是对于许多程序而言,访问硬件以及精确控制程序执行方式更为重要。Rust 的目标是让程序员拥有更多的控制权,使其“更接近金属”,但是 Go 提取了体系结构的详细信息,以使程序员更加接近问题。
两种语言有不同的使用范围。Golang 对于编写微服务和典型的 “DevOps” 任务很有用,但它不是系统编程语言。对于并发性,安全性和/或性能很重要的任务,Rust 更强。但是它的学习曲线比 Go 更陡。—Matthias Endler[20]
Go 发展更快
我在其他地方写过,对于大多数程序而言,性能并不如可读性重要[21]。但是,当性能确实很重要时,它真的很重要。Rust 进行了许多设计折衷,以实现最佳的执行速度。相比之下,Go 更加关注简单性,并且愿意为此牺牲一些(运行时)性能。但是 Go 的构建速度是无与伦比的,这对于大型代码库而言非常重要。
Rust 比 Go 快。在上述基准测试中,Rust 速度更快,在某些情况下还快一个数量级。但是在选择使用 Rust 编写所有内容之前,请考虑一下 Go 在许多基准测试中并没有落后很多,并且它仍然比 Java,C#,JavaScript,Python 等同类工具快得多。
如果你需要一流的性能,那么你可以选择这两种语言中的任一种。如果你要构建一个处理高负载的 Web 服务,并且希望能够在垂直和水平方向上进行伸缩,则两种语言都将非常适合你。—Andrew Lader[22]
正确性
我的看法:明天将要发布的代码选择 Go,在未来五年内保持不变的代码选择 Rust。—Grzegorz Nosek
尽管 Go 和 Rust 对于任何严肃的项目都是不错的选择,但最好使自己对每种语言及其特征都尽可能了解。最终,其他人的想法无关紧要:只有你可以决定哪种对你和你的团队是合适的。
如果你想加快开发速度,也许是因为你要编写许多不同的服务,或者你有庞大的开发团队,那么 Go 是你选择的语言。Go 为你提供了一流的并发性,并且不容许不安全的内存访问(Rust 也不容忍),但不会强迫你管理每个最后的细节。Go 是快速而强大的工具,但是它避免了使开发人员陷入困境,而专注于简单性和统一性。另一方面,如果需要拧紧块性能,那么 Rust 应该是你的选择。—Andrew Lader[23]
结论
我希望本文使你相信,Rust 和 Go 都值得你认真考虑。如果可能的话,你应该力求获得至少两种语言的某种程度的经验,因为它们对你在任何技术职业中都是非常有用的,即使你喜欢将编程作为业余爱好也是如此。如果你只有时间投入精力来学习一种语言,那么请在将 Go 和 Rust 都用于各种大小不同的程序之前,不要做出最终决定。
而且,对编程语言的了解实际上只是成为一名成功的软件工程师的一小部分。到目前为止,您将需要的最重要的技能是设计,工程,体系结构,沟通和协作。如果您擅长这些,那么无论您选择哪种语言,您都将是一名出色的软件工程师。学习愉快!
原文链接:https://bitfieldconsulting.com/golang/rust-vs-go
编译:polarisxu