go语言做什么的 Go编程语言

35白皮书 2023-01-08

我尽量尊重每个人的个人喜好所以我通常会避免争论哪种语言是更好的编程语言文本编辑器还是操作系统。

不过最近好几次被问到为什么喜欢和大量使用围棋所以这里有一篇连贯的文章来填补我即兴个人漫谈的空白:-)。

我的背景

我在许多像样的项目中使用过C和Perl。我用PythonRubyC ++CHICKEN SchemeEmacs LispRustJava写程序(仅限Android)。对LuaPHPErlangHaskell有所了解。上辈子我用Delphi开发了很多程序。

1。透明度

格式设置

传统上Gofmt工具用于格式化go代码。以编程方式格式化代码并不是一个新概念但是与其前辈相反它只支持gofmt的规范风格。

以同样的方式格式化所有代码以便于阅读。代码感觉很熟悉。这不仅在阅读标准库或Go编译器时有帮助而且在处理许多代码库(例如开源或大公司)时也有帮助。

此外自动格式化可以在代码检查过程中节省大量时间因为它消除了以前可以检查的代码的整个维度:现在您只需要让您的持续集成系统验证gofmt中不会有任何差异。

有趣的是让我的编辑器在gofmt保存文件时生效改变了我写代码的方式。我曾经尝试匹配格式化程序会做的事情然后让它纠正我的错误。如今我以最快的速度表达自己的想法并且相信gofmt可以让它变得很美(比如要打什么东西请点击“格式”)。

高质量代码

我使用许多标准库(docssource)请看下面。

到目前为止我看过的所有标准库代码质量都非常高。

一个例子是image/jpeg包:我当时不知道jpeg是怎么工作的但是通过在维基百科JPEG文章和image/jpeg代码之间切换很容易实现。如果对这个软件包有其他评论我把它当成教学实现。

评论

我同意Go社区的许多观点例如:

默认情况下变量名应该短一些并且随着声明使用名称的增加其名称也变得更具描述性。保持依赖性树很小(在合理的程度):稍微复制胜于一点依赖性引入抽象层是有代价的。Go代码通常非常清晰但有时会有些重复。有关更多信息请参见CodeReviewComments和Go Proverbs。

一些关键字和抽象层

Go规范只列出了25个关键词我很容易记住。

内置函数和类型也是如此。

以我的经验来看少量的抽象层次和概念让语言变得简单易学很快就感觉很舒服。

当我们谈论它时:我对Go规范的可读性感到惊讶。它似乎真的是针对程序员的(而不是标准委员会)。

2。速度

快速反馈/低延迟

我喜欢快速反馈:我希望网站可以快速加载我更喜欢流畅的用户界面他们不会滞后我会选择快速的工具而不是每天更强大的工具。大型网络媒体资源的调查结果证实这种行为是很多人共有的。

Go编译器的作者尊重我对低延迟的渴望:编译速度对他们来说很重要新的优化方案会仔细权衡他们是否会减慢编译速度。

我的一个朋友以前从未用过围棋。用安装的RobustIRC桥编译后他们得出的结论是Go一定是解释性语言我要纠正一下:不Go编译器就是那么快。

大多数Go工具也不例外比如gofmt和goimports都非常快。

更大资源使用率

对于批处理应用程序(相对于交互式应用程序)充分利用可用资源通常比低延迟更重要。

配置和更改Go程序以利用所有可用的IOPS、网络带宽或计算非常容易。例如我写了关于填充1 Gbps链接和优化debiman以利用所有可用资源的文章从而将其运行时间减少了几个小时。

3。丰富的标准库

Go标准库提供了有效使用公共通信协议和数据存储格式/机制的手段如TCP/IP、HTTP、JPEG、SQL、…

Go的标准库是我见过的更好的库。我认为它组织得很好很干净很小很全面:我经常发现我只需要使用标准库和一两个外部包就可以编写出合理大小的程序。

(通常)它不包含特定领域的数据类型和算法也不在标准库中(例如golang.org/x/net/html)。名为空的golang.org/x也用作新代码进入标准库之前的临时区域:to 1兼容性保证排除任何重大更改即使这些更改显然是值得的。一个的例子是golang.org/x/crypto/ssh,它必须打破现有的代码以建立一个更安全的默认值。

4。工具

为了下载、编译、安装和更新Go包我使用了go get工具。

我用过的所有Go代码库都使用内置测试函数。这不仅使得快速测试变得容易而且使得获得覆盖报告变得容易。

每当程序使用的资源比预期的多我就会启动pprof。介绍请参考golang.org的这篇博文pprof或者我关于优化Debian代码搜索的博文。导入。net/http/pprof包您可以在服务器运行时对其进行分析而无需重新编译或重新启动。

交叉编译就像为Raspberry Pi3设置GOARCH环境变量一样简单比如GOARCH=arm64。值得注意的是工具也可以跨平台工作!比如我可以从amd64电脑分析gok razy:gotoolprof ~/go/bin/Linux _ arm 64/DHCP http://gok razy:3112/debug/pprof/heap。

Godoc以纯文本形式显示文档或者通过HTTP提供文档。Godoc.org是一个公共实例但我运行一个本地实例用于离线使用或未发布的软件包。

请注意这些是该语言附带的标准工具。从C来说以上每一项都是重要的成果。在围棋中我们认为它们是理所当然的。

入门

希望能表达出我乐于使用Go的原因。

如果你有兴趣开始使用围棋请查看我们为加入Gophers休闲频道的人提供的初学者资源。

注释

当然没有编程工具也没有问题。因为这篇文章解释了为什么Go是我最喜欢的编程语言所以它将集中在积极的方面。不过我会顺便提一些问题:

如果使用不提供稳定API的Go软件包则可能要使用特定的已知工作版本。更好的选择是dep工具在撰写本文时它不属于该语言的一部分。惯用的Go代码不一定会转换为性能更高的机器代码并且运行时要付出(小的)代价。在极少数情况下我发现缺乏性能因此我成功地求助于cgo或汇编程序。但是如果您的域是硬实时应用程序或其他对性能至关重要的代码那么您的工作量可能会有所不同。我写过Go标准库是我见过的更好的库但这并不意味着它没有任何问题。一个示例是在通过标准库最旧的软件包之一以编程方式修改Go代码时对注释的复杂处理go/ast。