写点什么

使用 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:5016223
用户头像

发布了 43 篇内容, 共 34.1 次阅读, 收获喜欢 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
回复
没有更多了
发现更多内容

AI制作PPT软件有哪些?这款中文版Gamma值得推荐!

职场工具箱

效率工具 职场 PPT 办公软件 AI生成PPT

1场Keynote,7场技术演讲 | Karmada云原生多云容器编排引擎闪耀亮相 KubeCon China 2024

华为云原生团队

云计算 容器 云原生 KubeCON

云手机在亚马逊店铺运营中能发挥什么作用

Ogcloud

云手机 海外云手机 云手机海外版 亚马逊运营 亚马逊云手机

青椒云上线《黑神话:悟空》专属游戏云电脑,免安装,即点即用!仅需2.98/h

青椒云云电脑

云电脑 云电脑平台 黑神话悟空

如何选择合适的代理IP?

IPIDEA全球HTTP

ByteHouse案例实践:某平台如何基于OLAP大幅提升复杂查询效率?

字节跳动数据平台

数据库 大数据 云原生 Clickhouse 数仓

MES系统在铜加工行业的应用

万界星空科技

mes 万界星空科技 铜业 制造业工厂 铜加工

SOL项目开发代币DApp的基本要求、模式创建与海外宣发策略

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

云解析的宕机切换是什么意思?有什么用?

国科云

政策红利叠加技术支持:低门槛开发高潜力游戏直播平台

软件开发-梦幻运营部

上海锐起科技桌面虚拟化方案与中国芯的不解情缘

上海锐起科技

《黑神话》火到破纪录,老黄都要到游戏展秀一把:全景光追英伟达独享,同款技术还有20+游戏在路上

Openlab_cosmoplat

AI 游戏

2024-08-21:用go语言,给定一个从 0 开始索引的整数数组 nums 和一个整数 k,请设计一个算法来使得数组中的所有元素都大于或等于 k,返回所需的最少操作次数。 每次操作可以执行以下步骤

福大大架构师每日一题

福大大架构师每日一题

加密市场的挑战与机遇:周期性变化与未来叙事趋势

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

碳课堂|数字技术如何助力碳中和目标实现?

AMT企源

数字化转型 碳中和 碳达峰 碳管理

极客天成和ScaleFlux完成产品相互兼容认证

ScaleFlux

分布式存储 企业级SSD

KubeCon China 2024 现场见!与华为云原生专家畅聊服务治理,一起Meet The Authors !

华为云原生团队

云计算 容器 云原生 KubeCON

独家揭秘丨GreatSQL 的MDL锁策略升级对执行的影响

GreatSQL

小度联合新华网客户端,举办“AI技术对中小学教育的深度赋能”主题活动

科技热闻

一直没找到合适的开源富文本?何不尝试下Fluent Editor,一个基于Quill 2.0的富文本编辑器,功能强大、开箱即用!

OpenTiny社区

前端 OpenTiny TinyVue 开源组件库

华为云CodeArts API:API管理一体化平台 7月新特性介绍

华为云PaaS服务小智

API 华为云

数据库运维实操优质文章分享(含Oracle、MySQL等) | 2024年7月刊

墨天轮

MySQL 数据库 oracle sql postgresql

跟着 iLogtail 学习高质量软件建设

阿里巴巴云原生

阿里云 云原生

Flutter开发组合思路(小程序+App)

Geek_2305a8

亚马逊云科技服务之安全巡检及优化

伊克罗德信息科技

岳阳东宇第六家高端网咖开业,这位老板笃定14900K的原因是?

E科讯

解析淘宝商品评论API返回值中的用户信息与行为

技术冰糖葫芦

API Explorer API 接口 API 测试 API 策略 pinduoduo API

链动2+1系统开发升级版/规则玩法/案例设计/项目逻辑/源码功能

V\TG【ch3nguang】

沪港数据竞赛圆满落幕,启信宝独揽双重大奖

合合技术团队

科技 合合信息 启信宝

Cohere 创始人:语音是下一代用户界面;OpenAI 开放 GPT-4o 定制新功能丨 RTE 开发者日报

声网

IPQ5010 IPQ5018 WiFi 6 TRIBAND Routerboard | Industrial-Grade DR5018S

wallyslilly

ipq5018 IPQ5010

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