我从Python到Go的旅程

转到Elad Leev的个人资料 Elad Leev BlockedUnblockFollow关注3月19日

我喜欢Python。在过去的五年里,它一直是我的首选语言。 Python非常友好且易于学习,同时仍然保持超级有效。

您几乎可以使用它 - 从创建简单的脚本和Web开发到数据可视化和机器学习。

但Go的成熟度,强大的用户群以及越来越多的公司在成功进行基准测试后决定转向Go的事实让我更加广泛地阅读了Go,并思考如何将其添加到我的工具集并将其好处应用到我的工作中。

但是这篇文章不会谈论哪种编程语言更好--Pix或Go,在线有很多关于这个主题的帖子和比较,而且在我看来它确实取决于用例。

在这篇文章中,我将告诉你我从Python到Go的旅程,并为你提供一些技巧,让你了解一些帮助我在这次旅程中取得成功的资源,然后现场讲述这个故事。 Egon Elbre的 GIF

我遇到的主要差异

当然,作为第一步,我浏览了令人惊叹的官方" Tour Of Go ",这肯定给了我关于Go语法的强大基础知识。

为了加强这些知识,我阅读了Go for Python Programmers电子书,这使我能够继续下一步 - 我相信这是最具教育意义的 - 尝试和失败。

我使用了以前在Python中使用的常用函数,如JSON序列化或使用HTTP调用,并尝试在Go中编写它们。

通过在Go中应用Python中的类似概念,并且仍然接受语言的静态特性,我遇到了Go和Python之间的一些关键差异。

项目布局

首先,Python通常不需要特定的目录层次结构,而Go则另外需要。

Go使用"标准"布局,这种布局稍微复杂一点,创造了更多的工作,但好处是结构良好的代码库,它鼓励模块化代码,并在项目规模扩大时保持有序。

官方的" 如何编写Go代码 "有一个部分可以解释如何构建工作区

静态和强类型

Go是一种静态类型的语言,由于您习惯使用Python或Ruby等动态类型语言,因此最初会让您感到不舒服。

毫无疑问,动态语言更容易出错,并且在输入验证方面需要花费更多精力来防止常见语法或解析错误。考虑一个计算两个整数之和的函数,实际上并不能保证使用该函数的用户不会将字符串传递给函数---这将导致TypeError
这种情况 不会发生 在Go中,因为您需要声明每个变量的类型 - 您的函数可以获得哪种类型的变量,以及函数将返回哪种类型的变量。

起初它有点烦人,感觉它让我的编码速度慢得多,但是在Go读取和写入很短的时间后,你真的习惯了它,它实际上可以节省时间,并使你的代码更多更强大。

本机并发

Go使用goroutines和channel支持本机并发,现在可以非常方便。

首先,通道的概念可能有点棘手,并且很容易将其视为某种数据结构或排队实现。经过一些阅读后,它们变得更加直白,您可以真正享受它们带来的价值,并充分利用它们。

Ivan Daniluk简单可视化goroutines和频道---

 `package main` 
 `func main() { // create new channel of type int ch := make(chan int)` 
 `// start new anonymous goroutine go func() { // send 42 to channel ch <- 42 }() // read from channel <-ch }` 

有关更多示例,请查看goutoutine,channel和select语句的Hootsuite现实生活实现 ,或ArdanLabs的这个重要解释。

使用JSON

好吧,没有更多json.loads()给你。
在Python中,反序列化JSON对象非常简单 - 只需使用json.loads就可以了!
但在Go中,作为一种静态类型语言,这种简单的操作可能会更棘手。

在Go中,您将JSON解析为之前定义的结构。任何不适合结构的字段都将被忽略,这是一件好事。将其视为双方之间的预定义协议。您真的不需要对JSON中收到的数据感到"惊讶",并且JSON字段和类型需要由双方"同意"。

 `{ "first": "Elad", "last": "Leev", "location":"IL", "id": "93" }` 

 ``type AccountData struct { First string `json:"first"` Last string `json:"last"` Location string `json:"location"` ID string `json:"id"` }`` 

当然,你仍然可以在没有结构的情况下反序列化JSON,但是如果可能的话应该避免使用它,并且拥抱语言的静态性质总是更好。

为了更好地理解Go中的JSON编码,您可以查看这篇文章 ,或者使用" Go By Example "---这是您将拥有的最终备忘单资源。
太懒了把你的JSON转换成Go结构?没问题--- 这个工具会为你做的

清洁代码

Go编译器将始终尽力保持代码清洁。
Go编译器将未使用的变量视为编译错误,而且,Go采用了独特的方法让机器处理大多数格式问题。
Go将在保存或编译时运行gofmt程序,它将处理大多数格式问题。

你不关心其中一个变量?再次---没问题!只需使用_ (下划线)并将其分配给空标识符。

包含Go 格式信息的必读文档是" Effective Go "。 我的旅程还在继续

找到合适的图书馆和框架

我真的习惯了我的Python框架和库,如Flask,Jinja2,Requests甚至Kazoo,我真的很担心我找不到适合Go的。
但是你可以猜到,Go这个伟大的社区拥有自己独特的图书馆,甚至可以让你完全忘记旧图书馆。
以下是我的一些偏好---

Python Requests => net / http 内置的net / http提供了非常好的HTTP客户端和服务器实现,并且非常易于使用。
Flask + Jinja2 =>杜松子酒
Gin是一个HTTP Web框架,它有一个非常简单的API ---路径中的参数,上传文件,分组路由( /api/v1/api/v2 ),自定义日志格式,提供静态文件,HTML呈现和真正强大的自定义中间件。
看看这个基准。
CLI Creation => Cobra Cobra既是用于创建功能强大的CLI应用程序的库,也是用于生成应用程序和命令文件的程序。
许多最广泛使用的Go项目都是使用Cobra构建的,包括Kubernetes,etcd和OpenShift。

我强烈推荐的其他一些库包括: ViperGonfig和这个很棒的列表--- Awsome-Go

其他资源

在我的Go之旅中,很少有其他资源能够帮助我 -

[1] Francesc Campoy ---你 一定 要查看他的YouTube频道GitHub个人资料
Francesc也没有很多伟大的研讨会 - Go Tooling in ActionWeb Applications Workshop

[2] GopherCon视频

[3] Go Web Examples

[4] Golang WeeklyGopher AcademyGolang News Twitter账户。

摘要

作为一名狂热的Python用户五年,我担心过渡到Go会很痛苦。

但我真的很兴奋,看到有一个真正强大的社区,贡献和维护优秀的资源,帮助您顺利过渡到Go。

Go是当今发展最快的编程语言之一,我希望Google能够成为Go编写云应用程序和基础架构的首选语言

对Go来说这是一个激动人心的时刻,我鼓励大家查看并成为Gophers!

查看英文原文

查看更多文章

公众号:银河系1号

联系邮箱:public@space-explore.com

(未经同意,请勿转载)