时间 2019-03-23 12:03:26 InfoQ
原文
主题 Python Go 语言
我喜欢 Python, 在过去的五年里, 它一直是我的首选语言. Python 非常友好且易于学习, 迄今仍然超级有效.
几乎可以用它来做任何事情 - 从创建简单的脚本, web 开发, 到数据可视化以及机器学习.
但随着 Go 日趋成熟, 强大的用户群, 事实上越来越多的公司在成功进行基准测试后决定 转向 Go https://github.com/golang/go/wiki/SuccessStories , 驱使我阅读了大量 Go 相关的知识, 思考如何将其添加到我的工具集以便在工作中应用它的好处.
这篇文章不会讨论哪种编程语言更好 - Python 或 Go, 网络上有很多关于这个主题的帖子和比较, 在我看来区别在很大程度上取决于用例.
在这篇文章中, 我将告诉你我从 Python 到 Go 的旅程, 并提供一些技巧, 让你了解一些帮助我在这次旅程中取得成功的资源, 然后现场讲述这个故事.
正文
遇到的主要差异
自然, 作为第一步, 我浏览了令人惊叹的官方 "Tour Of Go https://tour.golang.org/welcome/", 这肯定给了我关于 Go 语法的强大基础知识.
为了加强这些知识, 我阅读了 Go for Python Programmers 这本电子书, 使我能够继续下一步, 我认为这是最具教育意义的尝试和失败.
我使用了以前在 Python 中常用的函数, 如 JSON 序列化或 HTTP 调用, 并尝试在 Go 中编写它们.
通过这样在 Go 中应用 Python 中的类似概念, 并且仍然保持语言的静态特性, 我遇到了 Go 和 Python 之间的一些关键差异.
项目布局
首先, Python 通常不需要特定的目录层次结构, 反之, Go 则需要.
Go 使用 "标准" 布局, 这让它比 Python 稍微复杂一点, 带来了更多工作, 但好处是结构良好的代码库, 它鼓励模块化代码, 在项目规模扩大时能保持有序.
官方的文章 "如何编写 Go 代码 https://golang.org/doc/code.html" 有一个章节清晰地解释了如何构建 工作区 https://golang.org/doc/code.html#Workspaces .
静态和强类型
Go 是一种静态类型的语言, 由于大家习惯使用 Python 或 Ruby 等动态类型语言, 因此初期会感到不太舒服.
毫无疑问, 动态语言更容易出错, 并且在输入的验证上需要花费更多精力来防止常见语法或解析错误. 想想计算两个整数之和的某函数, 实际上并不能保证用户在使用它时不会将一个字符串传递给函数 - 这会导致一个 TypeError.
这种情况 不会发生 在 Go 中, 因为需要声明每个变量的类型, 函数可以获得哪种类型的变量, 以及函数将返回哪种类型的变量.
起初它有点烦人, 感觉让编码速度慢了很多, 但是通过短暂的 Go 学习和编写后, 你会真正地习惯去用它, 并发现实际上它能节省时间, 让代码更健壮.
本机并发
Go 利用 goroutines 和 channels 支持本机并发, 现在真的很方便.
首先, channels 的概念可能有点小麻烦, 并且很容易被当成某种数据结构或排队的实现. 其实了解下来这些概念更加直白, 可以真正享受它们带来的价值, 并进行充分的利用.
Ivan Daniluk https://divan.dev/posts/go_concurrency_visualize/ 对 goroutines 和 channels 进行了简单的可视化:
- packagemain
- funcmain(){
- // create new channel of type int
- ch :=make(chanint)
- // start new anonymous goroutine
- gofunc(){
- // send 42 to channel
- ch <-42
- }()
- // read from channel
- <-ch
- }
更多相关示例, 请查看 goutoutines,channels 和 select 语句的 Hootsuite 现实生活实现 , 或 ArdanLabs 很棒的 解释 .
使用 JSON
在 Go 里面, 不再使用 JSON.loads(). 在 Python 中, 反序列化 JSON 对象非常简单, 只需使用 JSON.loads 即可! 但在 Go 中, 作为一种静态类型语言, 这种简单的操作可能会更棘手.
在 Go 中, 可以将 JSON 解析为一种预定义结构. 任何不适合该结构的字段都将被忽略, 这是一个好事, 可以把它当成双方之间的预定义协议. 不会需要对 JSON 中收到的数据感到 "惊讶",JSON 字段和类型需要双方 "同意".
- {
- "first":"Elad",
- "last":"Leev",
- "location":"IL",
- "id":"93"
- }
- typeAccountDatastruct{
- Firststring`json:"first"`
- Laststring`json:"last"`
- Locationstring`json:"location"`
- IDstring`json:"id"`
- }
当然, 仍然可以在没有结构的情况下反序列化 JSON, 但是如果可能的话应该避免这样做, 保持语言的静态性质总是更好的选择.
为了更好地理解 Go 中如何编写 JSON, 可以查看 这篇文章 https://eager.io/blog/go-and-json/ , 或 "Go By Example https://gobyexample.com/json", 这是可以找到的作为备忘单的最终资源.
如果太懒而不想把 JSON 转换成 Go 结构? 没问题 - 这个工具 https://mholt.github.io/json-to-go/ 可以帮你.
清洁代码
Go 编译器始终尽力保持代码的清洁, 将未使用的变量视为编译错误. 而且, Go 采用了独特的方法让计算机能处理大多数格式问题. 在保存或编译时 Go 会运行 gofmt 的程序, 它会处理大多数的格式问题.
如果不关心其中的一个变量? 没问题! 只需使用 _(下划线) 并将其分配给空标识符即可.
包含 Go 的格式信息的必读文档是 "Effective Go".
找到合适的库和框架
我真的习惯了 Python 框架和库, 如 Flask,Jinja2,Requests 甚至 Kazoo, 我真的很担心找不到适合 Go 的. 但是可以猜到, Go 这个伟大的社区拥有自己独特的库, 甚至可以让你完全忘记旧的喜好是什么.
以下是一些个人偏好 :
Python Requests=>net/http
内置的 https://golang.org/pkg/net/http/ 提供了 HTTP 客户端和服务器, 实现得非常棒且非常易用性好.
Flask + Jinja2=> Gin
Gin https://github.com/gin-gonic/gin 是一个 HTTP Web 框架, 具有非常简单的 API - 路径参数, 上传文件, 分组路由 (/API/v1 ,/API/v2), 自定义日志格式, 提供静态文件, HTML 渲染, 真正强大的自定义中间件. 这里 提供了 benchmark 参考.
CLI Creation=> Cobra
Cobra https://github.com/spf13/cobra 库可用来创建功能强大的 CLI 应用, 还提供了生成应用和命令文件的程序. 许多广泛使用的 Go 项目都是使用 Cobra 构建的, 包括 Kubernetes,etcd 和 OpenShift.
强烈推荐的一些其他的库是: Viper https://github.com/spf13/viper , Gonfig https://github.com/tkanos/gonfig 和一个很棒的列表 - Awsome-Go https://github.com/avelino/awesome-go .
其他资源
在我的 Go 之旅中, 下面是一些起到了极大帮助的资源:
[1] Francesc Campoy https://twitter.com/francesc - 一定 要看看他的 YouTube 频道 和 GitHub 个人资料 https://github.com/campoy .Francesc 还组织了一些伟大的研讨会 - - Go Tooling in Action https://github.com/campoy/go-tooling-workshop 和 Web Applications Workshop https://github.com/campoy/go-web-workshop .
[2] GopherCon 视频
[3] Go Web Examples https://gowebexamples.com/
[4] 几个 Twitter 账户: Golang Weekly https://twitter.com/golangweekly , Gopher Academy https://twitter.com/GopherAcademy , Golang News https://twitter.com/golangnews .
总结
作为一名五年狂热的 Python 用户, 我担心过渡到 Go 会很痛苦. 但我真的很兴奋, 看到有一个真正强大的社区, 贡献率和维护都很优秀的资源, 可以帮助大家顺利过渡到 Go.Go 是当今发展最快的编程语言之一, 希望 Google 能够好好管理, 让 Go 成为编写云应用和基础架构的首选 语言 .
目前对 Go 来说是一个激动人心的时刻, 鼓励大家都来学习并成为 Gophers!
来源: http://www.tuicool.com/articles/MveYj2z