【QCon】精华内容上线85%,全面覆盖“人工智能+”的典型案例!>>> 了解详情
写点什么

使用 Python 5 年后,我转向了 Go

  • 2019-03-23
  • 本文字数:2617 字

    阅读完需:约 9 分钟

使用 Python 5 年后,我转向了Go

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


几乎可以用它来做任何事情 – 从创建简单的脚本,Web 开发,到数据可视化以及机器学习。


但随着 Go 日趋成熟,强大的用户群,事实上越来越多的公司在成功进行基准测试后决定转向Go,驱使我阅读了大量 Go 相关的知识,思考如何将其添加到我的工具集以便在工作中应用它的好处。


这篇文章不会讨论哪种编程语言更好 – Python 或 Go,网络上有很多关于这个主题的帖子和比较,在我看来区别在很大程度上取决于用例。


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


正文

遇到的主要差异

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


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


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


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

项目布局

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


Go 使用“标准”布局,这让它比 Python 稍微复杂一点,带来了更多工作,但好处是结构良好的代码库,它鼓励模块化代码,在项目规模扩大时能保持有序。


官方的文章“ 如何编写Go代码 ”有一个章节清晰地解释了如何构建工作区

静态和强类型

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


毫无疑问,动态语言更容易出错,并且在输入的验证上需要花费更多精力来防止常见语法或解析错误。想想计算两个整数之和的某函数,实际上并不能保证用户在使用它时不会将一个字符串传递给函数 – 这会导致一个 TypeError。


这种情况不会发生在 Go 中,因为需要声明每个变量的类型,函数可以获得哪种类型的变量,以及函数将返回哪种类型的变量。


起初它有点烦人,感觉让编码速度慢了很多,但是通过短暂的 Go 学习和编写后,你会真正地习惯去用它,并发现实际上它能节省时间、让代码更健壮。

本机并发

Go 利用 goroutines 和 channels 支持本机并发,现在真的很方便。


首先,channels 的概念可能有点小麻烦,并且很容易被当成某种数据结构或排队的实现。其实了解下来这些概念更加直白,可以真正享受它们带来的价值,并进行充分的利用。


Ivan Daniluk对 goroutines 和 channels 进行了简单的可视化:


package mainfunc 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}
复制代码



更多相关示例,请查看 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” }
复制代码



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 会运行 gofmt 的程序,它会处理大多数的格式问题。


如果不关心其中的一个变量?没问题!只需使用 _(下划线)并将其分配给空标识符即可。


包含 Go 的格式信息的必读文档是“ Effective Go”。


找到合适的库和框架


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


以下是一些个人偏好 :


Python Requests =>net/http


内置的net/http提供了 HTTP 客户端和服务器,实现得非常棒且非常易用性好。


Flask + Jinja2 => Gin 


Gin是一个 HTTP Web 框架,具有非常简单的 API – 路径参数,上传文件,分组路由(/api/v1 ,/api/v2),自定义日志格式,提供静态文件,HTML 渲染,真正强大的自定义中间件。这里提供了 benchmark 参考。


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] 几个 Twitter 账户:Golang WeeklyGopher AcademyGolang News

总结

作为一名五年狂热的 Python 用户,我担心过渡到 Go 会很痛苦。但我真的很兴奋,看到有一个真正强大的社区,贡献率和维护都很优秀的资源,可以帮助大家顺利过渡到 Go。Go 是当今发展最快的编程语言之一,希望 Google 能够好好管理,让 Go 成为编写云应用和基础架构的首选语言


目前对 Go 来说是一个激动人心的时刻,鼓励大家都来学习并成为 Gophers!


原文链接:https://medium.com/appsflyer/my-journey-from-python-to-go-3859783c6b3c


2019-03-23 13:5016112
用户头像

发布了 43 篇内容, 共 33.2 次阅读, 收获喜欢 136 次。

关注

评论 5 条评论

发布
用户头像
其实静态语言才有写程序的感觉。
动态的总感觉浅尝辄止不够尽兴。
可惜现在动态语言大行其道也大大降低了码农的门槛。
很多人通过培训等途径插队进入,嗯,不错。
2019-04-01 15:28
回复
动态语言做精通你试试要用多长时间,门槛不是感觉自己会了,没用
2022-04-25 09:31
回复
用户头像
看来作者没写过c
2019-03-31 00:27
回复
用惯了脚本的转过来用静态语言写程序,不适应是正常的。C和汇编的精妙只有少数人才能尝到
2019-04-01 10:35
回复
人家记录真实技术经历,你两大聪明跑来秀优越。没看你两博文呢
2022-04-25 09:33
回复
没有更多了
发现更多内容

GaussDB(DWS) NOT IN优化技术解密:排他分析场景400倍性能提升

华为云开发者联盟

数据库 GaussDB(DWS) 排他分析 NOT IN

加盟共享洗车多少钱?投入大吗?

共享电单车厂家

加盟共享洗车 自助洗车加盟费用

安全感何止“亿”点 看云电脑如何保障企业云网安全

天翼云开发者社区

开源之夏IoTDB项目宣讲会落幕,你关心的问题这里都有

Apache IoTDB

时序数据库 Apache IoTDB 开源之夏

模块一作业

joak

自建Gitlab迁移工具使用指南

阿里云云效

云计算 阿里云 gitlab 代码迁移 代码库

Java中观察者模式与委托,还在傻傻分不清

华为云开发者联盟

Java 观察者模式 委托 事件执行者

Spring Cloud Alibaba 开源之夏,最后 7 天倒计时

阿里巴巴云原生

阿里云 云原生 spring cloud alibaba 开源之夏

妙!JMeter/Pytest/Ginkgo 和自建测试平台这样接入 Zadig

Zadig

DevOps 云原生 自动化测试 CI/CD

【科普】如果程序员穿越到古代当皇帝,会发生什么?

阿里巴巴云原生

阿里云 云原生 消息队列 EventBridge

英特尔On产业创新峰会:脚踏实地挖掘每一分性能潜能,着眼未来保证PC产业可持续发展

科技新消息

AliAGC 自动增益控制算法:解决复杂场景下的音量问题

阿里云视频云

算法 3A 音频

宜搭小技巧|海量数据管理难?这招帮你事半功倍

一只大光圈

钉钉宜搭

2022年第1季度中国网络零售B2C市场交易规模达16988.5亿元

易观分析

网络零售

“双碳”背后的硬核存储(上)

天翼云开发者社区

国内首批|观测云获得信通院 “可观测性平台技术能力”最高级认证!

观测云

可观测性 可观测

共享自助洗车多少钱一次?怎么收费

共享电单车厂家

自助洗车加盟 自助洗车多少钱一次 共享自助洗车多少钱 自助洗车怎么收费

重磅发布 | Serverless 应用中心:Serverless 应用全生命周期管理平台

阿里巴巴云原生

阿里云 Serverless 云原生 应用中心

6元自助洗车既能省钱还能赚钱?

共享电单车厂家

自助洗车加盟 6元自助洗车 车白兔自助洗车

开放报名 | Serverless 技术进阶研读班,碎片时间提升技术新方式

阿里巴巴云原生

阿里云 Serverless 云原生 研读版 活动报名

“双碳”背后的硬核存储(下)

天翼云开发者社区

为什么越来越多人选择自助式洗车

共享电单车厂家

自助洗车加盟 车白兔自助洗车 自助式洗车

Java中的线程到底有哪些安全策略

华为云开发者联盟

Java 线程 高并发 线程安全 并发容器

模块一

Geek_2ce415

大前端技术的边界在哪里?

博文视点Broadview

弱网优化,GCC 动态带宽评估算法(内附详细公式)

融云 RongCloud

通信系统 链路 网络管理

LSM树读写放大问题及KV分离技术解析

移动云大数据

HBase LSM树

最佳实践 | 用腾讯云AI人脸融合实现云毕业照推广活动小程序

牵着蜗牛去散步

腾讯 技术实践 腾讯云AI 人脸融合 云毕业照

天翼云电脑和企业安全“锁”了

天翼云开发者社区

DevOps 向业务进阶,BizDevOps 要如何实现?

SoFlu软件机器人

Apache Knox SSO 及在移动云 EMR 中的实践

移动云大数据

MapReduce服务

使用 Python 5 年后,我转向了Go_编程语言_Elad Leev_InfoQ精选文章