为什么我爱Golang

我喜欢Go编程语言,或者有人称它为Golang。 很简单,也很棒。

我在切线上写这个。 没想到Golang会这么好。

我首先在2016年1月左右回去,那里有一个相对较小但热情的社区。

当时我并没有考虑太多,我在磨练自己的编程技能,而Golang只是我用来完成任务的工具。

甚至在一年前,使用go还是很棒的。 一旦掌握了通用语言,该过程就很简单了。

我为Visualead (我工作的公司)编写了关键代码,但它并没有让我们失望,一年后仍在生产中运行,此后零维护。

最近,我发现自己再次使用Golang,不得不写关于我爱上Golang的原因。

GOPATH环境

这是您开始使用Go编写后必须首先处理的事情之一。

在计算机上的任何位置设置GOPATH目录,其中包含bin,src和pkg目录,您就可以开始编写了。

// How the directory structure looks like: go - bin - pkg - src

在我的主目录下,我为所写的每种编程语言创建一个新目录。我的用户主目录中充满以下文件夹:

chef cpp elixir elm go javascript meteor ocaml php python scala

除了Go之外,这些语言都没有强制执行此结构。 Go会强制您为所有Golang物品定义一个根目录,并且这样做的确有充分的理由。

Golang应用程序

是否要创建新的Golang应用程序? 简单。

转到$ GOPATH / src目录,创建一个新文件夹,创建一个新文件。go,调用包main,添加一个func main(){}函数即可。 从那一刻开始,您就可以使用所有的Go功能。

更多关于Go的好东西即将出现! 但首先要谈谈Golang模块。

Golang模块

我最喜欢的编程范例做得很好。 我认为模块系统是面向对象类系统的一种替代。

Golang称其为模块包。 因此,从现在开始,每当我们说一个模块时,我们就意味着一个包,反之亦然。

Module == Package == Module

在Golang中,您创建的每个目录都将成为一个包。 如果包的名称为main,则它可以成为应用程序。这有助于将代码自然地分离为可管理的逻辑块。

您始终希望从可重用的组件或程序包(如果使用Golang)中创建业务逻辑。

在我当前的应用程序中,我必须处理某些文件中的某些行,并在完成后将其上传到AWS S3。

我的应用程序结构如下所示:

src - my_app - - main.go - - main_test.go - - uploader - - - uploader.go - - - uploader_test.go - - replace_file_lines - - - replace.go - - - replace_test.go - - - strings_util.go - - - strings_util_test.go

_test.go文件当然是为Golang进行单元测试文件的方式,Golang具有内置的测试框架。

对于那些来自面向对象语言的人来说,也可以认为这里的每个目录都是完整的静态类,.go文件中的每个函数或变量都将成为属性或方法。

这是一个replace.go可能看起来像的示例:

如果一个目录共享多个.go文件,则所有方法和变量在整个程序包之间共享,甚至在私有程序包之间也是如此。 它有助于将包分成更小的块,并避免大的单个文件。

在不涉及面向对象与功能/过程的情况下,重要的是要知道Go创建者决定不将经典类包括在语言中。 相反,选择使用结构/接口和程序包。

Golang Gofmt

Golang约定了所有内容的外观,每种情况和每行所需的确切间距。

这使开发人员可以专注于编写代码,而不是对花括号位置发动战争。

旧的{} vs {\ n}战争:

或者,也许我只是因为我一方在围棋中获胜而感到高兴?

在此处了解更多信息: https : //golang.org/cmd/gofmt/

Golang导入

导入始终相对于GOPATH / src。 总是。 我不能高估这个决定为我节省了多少挫败感。

警告:下一行有意混淆。

在使用其他语言时,您可以使用相对/绝对导入,或者以某种方式设置一个怪异的导入,该导入将允许您从不知道位置的位置导入文件(我在看Python)。

Go以独特的方式解决了问题。 所有导入,无论在哪个文件中,都始终相对于GOPATH / src

因此,在my_app的情况下,其主要导入将如下所示:

my_app在src下,因此我们需要先提及它,然后导入my_app下存在的包,例如uploader和replace_file_lines。 注意,我们不是导入单个文件,而是导入整个包。 像魅力一样工作并引起零混乱。

此外,除非您实际使用导入的软件包,否则Golang不会编译,此小功能可帮助您知道实际使用了每个导入。

期望您的程序员编写干净的代码而没有未使用的导入? 您为什么不让当地的Gopher来照顾呢?

Golang Get系统

导入部分将引导我们转到Golang的下一个重要功能,即go get功能。 虽然其他人对JavaScripts NPM软件包管理器印象深刻,但Go只是使用任何git存储库作为其软件包管理器。

它是如何工作的?

我之前写过我需要上传到S3,对吗? 那么那意味着我需要AWS开发工具包来完成该任务。

为了使这项工作有效,我只需打开终端并输入:

go get github.com/aws/aws-sdk-go

这里发生了什么? 没什么特别的,Golang只是从https://github.com/aws/aws-sdk-go下载回购文件到您的GOPATH / src目录中。

然后,只需使用aws-sdk即可导入它:

还记得所有导入都相对于GOPATH / src吗? 由此可见,例如s3包现在位于GOPATH / src / github.com / aws / aws-sdk-go / services / s3下。

简单。 优雅。 地鼠的另一颗星。

Golang构建和打包系统

到目前为止,我们一直将重点放在GOPATH / src上,但还有其他目录需要我们处理,即GOPATH / pkg和GOPATH / bin。

Golang是一种编译语言,这意味着必须对其进行编译才能运行。 Golang快速编译。 它是如何工作的?

每次编译代码以运行它时,Golang都会在与包相同的路径中仅在GOPATH / pkg目录下创建一个.a文件。 这意味着,例如,如果您编译aws-sdk。 它将被编译一次,并在所有其他代码之间共享。

当然,这并不是Golang快速编译的唯一原因,但这只是一个介绍,可以帮助您了解GOPATH / pkg的作用

现在,GOPATH / bin呢? 当您运行go install命令时,go将创建一个二进制文件,并将其放在GOPATH / bin下,在本例中,该文件将获得主软件包目录my-app的名称。

为什么这么好? 好了,您可以将GOPATH / bin添加到全局PATH变量中,并且您的构建的所有二进制文件都可以在命令行中使用,而无需执行任何额外的工作! (很棒:D吗?)

Golang跨平台构建

部署到其他发行版而不是编写代码的发行版? 好吧,不用担心,您不需要Windows机器就可以为Windows构建代码。 高朗让你受够了。

赶紧跑:

GOOS=windows GOARCH=amd64 go install

并且我们的代码将输出一个二进制文件,准备在Windows机器上进行部署。 .exe文件将出现在GOPATH / bin / windows_amd64 / my_app.exe中。 像在公园散步。

Golang语言

Golang旨在成为一种简单的语言。

我喜欢以下帖子,询问为什么Go并非设计成功能语言: https : //www.quora.com/Why-wasnt-Go-writing-as-a-functional-language

“在Google工作的程序员是职业生涯的早期,并且最熟悉过程语言,尤其是C家族的语言。 需要以一种新的语言快速提高程序员的工作效率,这意味着该语言不能过于激进。”

而且很简单。

以下是Golang不支持的一些功能:

  1. 班级
  2. 运算符超载
  3. 函数重载
  4. 可选参数
  5. 例外情况

尽管有时我发现自己在使用Go编写语言时缺少语言功能,但我总是可以做我想做的所有事情。 只是有时它需要更多的写作和思考。 最重要的是,它导致代码更容易推理,因为它不那么抽象。

有时候,这使我感到惊讶,因为没有那么多年的经验,仅仅因为该语言是如此的融洽和清晰,我就能以多么快的速度实现目标。

Golang并发

我出于最后目的离开了并发性讨论。 为什么? 因为我认为这并不重要。

这是该语言的惊人功能。 但有时它被视为Go的本质,但我认为并非如此。

因此,让我尝试将其总结为一个段落。

是的,Golang具有很好的并发性。 您无需处理线程,而是创建廉价的goroutine,这些例程易于制造和管理。 Goroutine允许您在所有CPU上分配负载,而不必担心如何管理所有负载。

仍然对了解goroutines感兴趣吗? 在这里阅读有关它们的信息: https : //tour.golang.org/concurrency/1

戈朗地鼠

来吧,他真可爱!

我是否提到我是函数式编程的狂热者? 那为什么我对Golang如此着迷呢? 它甚至没有关于mondas的概念。 谁知道……宇宙以神秘的方式运转。

From: https://hackernoon.com/why-i-love-golang-90085898b4f7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值