十五条有用的Golang编程经验

2017 年 8 月 7 日 CSDN大数据 Jason Kulatunga
十五条有用的Golang编程经验
↑ 点击上方蓝字关注我们,和小伙伴一起聊技术!


本文作者在很短的时间内就从对Golang一无所知到开发出真正的产品。在学习Golang的过程中,他总结出十五条编程经验以分享给读者。以下是译文。



像许多其他的开发者一样,我听到过很多有关Golang的传闻。也许你还不熟悉它,那么我告诉你,它是Google开发的开源语言。我之所以对Golang感兴趣,是因为它是一种静态类型编译的现代语言。


长久以来,这就是我所知道的有关Golang的所有信息。我本打算在有空的时候详细了解一下的,但一直都有其他优先级更高的事情要做。大约4个月前,我意识到Golang也许可以用来解决我在CapsuleCD中遇到的一个问题,CapsuleCD是一款我写的可用于任何语言的通用自动化软件包发布工具(npm,cookbooks,gems,pip,jar等)。


我遇到了这么一个问题:CapsuleCD是一个基于Ruby的可执行文件,这意味着任何想要使用CapsuleCD的人都需要在他们的机器上安装Ruby解释器,即使他们想做的只是打包一个Python库。这使得我的Docker容器更加臃肿,开发起来更加复杂。如果只需要把单个二进制文件下载到容器中就好了。所以,把项目移植到Golang这个想法在那一刻突然出现在我的脑海里。


在接下来的几个月里,我反复思考这个想法,几周后,我终于坐了下来,开始把我的3000行Ruby应用程序移植到Golang。虽然我刚刚买了一本类似于Golang傻瓜教程这样的书,但我还是决定直接进行编码,只有在遇到问题卡住的时候才去找博客帖子和stack overflow。


我已经听到一些人劝我放弃的声音。说实话,虽然我玩得很开心,但我最开始开发得非常慢。我是在不知道任何约定的情况下尝试着用一门新的语言来编写这个应用程序。事实是,我喜欢它。那些“啊哈!”的时刻,以及在一此巨大的重构之后再次编译成功的喜悦是一种令人难以置信的动力。


下面是我在把应用程序移植到Golang的过程中学到的一些意想不到的以及非常规的事情。


请注意,这些是我在写Golang代码的过程中遇到的未曾料想到的东西,我以前使用的都是流行语言以及动态类型语言(C ++,C#,Java,Ruby,Python和NodeJS)。这些观点不一定就是对Golang的批评。我能够在两周内从对这个语言零基础到发布应用程序,我真是太牛逼了。


在写第一行代码之前


包的布局


虽然这对于需要编译的语言来说并不是必需的,但Golang需要,只是我并没有找到一个像Ruby、Chef或Node那样的标准目录结构。有一些比较流行的社区,但我本人还是最喜欢Peter Bourgon的建议。



不支持循环依赖


当你发现Golang不支持包之间的循环依赖时,包的布局就变得尤为重要。如果A导入B,B导入A,Golang将会报错。我开始有点喜欢上它了,因为这迫使我更多地去思考应用程序的领域模型。



依赖管理


npm、pypi和bundler,这每一个包管理器都是他们对应编程语言的代名词。然而,Golang还没有官方的包管理器。社区提供了一些不错的选择,但问题是他们都很好,要选出一个合适的博爱管理器有点困难。我最终选择了Glide,因为感觉它跟bundler和npm有点类似。


文档


这应该是Golang做得最好的事情之一了。 go docs和godoc.org这两个网站都非常得棒,并且所有的库的文档进行了标准化。这比包文档都是自定义和自托管的NodeJS社区前进了一大步。


GOROOT, GOPATH


Golang的import机制有点奇特。与大多数其他的语言不同,Golang要求把源代码放在预先配置好的文件夹中。我没有深入研究这个细节,但你应该知道这需要做一些设置,你要习惯这个。 Dmitri Shuralyov的我如何在多个工作区中使用GOPATH是一个很好的资源。



挠痒痒


伪结构体继承


在设计继承模型时,Golang开发人员做了一些有趣的事情。Golang遵循类似于Ruby的多重组合模式, 而不是使用类型语言规定的更为传统的继承模型(多继承或经典继承)。 如果不能完全理解Method-Shadowing,可能会出现一些意想不到的结果。


鸭式接口


这是Golang的另一个很酷的意想不到的功能。我仅在动态类型语言中看到过鸭式接口。这个鸭式与struct密切相关。


结构体中可以定义字段,但接口不行


不幸的是,structs与interfaces不能具有相同的API,因为interfaces无法定义字段。这个问题并算很大,因为可以在接口中定义getter和setter方法,虽然这有点混乱。我相信,应该有一个技术上或者计算机理论上的解释能够回答为什么要这么做。


Public和Private命名


Golang将Python的public和private方法命名方案做了进一步发展。当我最初发现以大写字母开头的函数、结构体是public,而小写开头的则是private的时候,我哑口无言。但老实说,在用Golang开发了两个星期之后,我真的很喜欢这种习惯。



defer


这是另外一个非常有用的Golang特性。我形象这是Golang实现并行处理和错误模型的结果,但defer可以很容易地让源代码看起来更清晰。从某种意义上来说,我把它看做是try-catch-finally模式下的finally方法,或是C#/Java中的using代码块。但我相信它还有更多更有创造性的用法。


go fmt很不错


你不会跟一个Golang开发者进行有关“Tab vs 空格”的争论。Golang有标准的代码风格,go fmt会对代码进行重新格式化。通过阅读它的源代码,我了解到了强大的parser和ast库。


GOARCH、GOOS、CGO和交叉编译


我创建CapsuleCD独立二进制文件的目的是要将端口启动到Golang上。但是,很明显,简单的静态二进制文件并不是Golang的内在特性。如果你的代码及其相关的依赖全部是用Golang写的,那么你可以用GOOS和GOARCH来构建静态二进制文件。但是,如果你像我一样不幸运,存在某个依赖需要在底层调用C代码的话,那么你将会陷入痛苦之中。不要误会我,创建一个动态链接库还是比较容易的。但是,要生成一个没有外部依赖关系的静态二进制文件,需要确保所有的C依赖项(及其依赖项)都是静态链接的。GOOS和GOARCH支持的对应值组合表可以在Golang文档中找到。


如何进行测试?


藏在眼皮底下


测试文件的后缀为_test.go,并且应该跟被测试的代码放在同一个目录中,而不要放在某个特殊的测试目录中。这还好,虽然一开始看着有点混乱。


测试数据放在一个特殊的testdata目录中。 使用go build时,testdata目录和_test.go文件都会被编译器忽略。


go list和vendor目录


依赖关系管理对于Golang来说是相当新鲜的,并不是所有的工具都能理解特殊的vendor文件夹。因此,当你运行go test时,默认情况下会发现它运行了所有依赖项的测试。使用go list | grep -v /vendor可以让Golang忽略vendor目录。



if err != nil


我是一个很看重代码覆盖率的人。我一直在努力让我的开源项目达到80%以上的代码覆盖率,但是,在使用Golang的时候,我感觉这很困难。那些已经熟悉Golang的人可能会说,Golang是一个能达到较高代码覆盖率的语言之一。Golang将所有错误都视为标准对象,而不是为错误创建一个独立的执行路径(try-catch-finally)。 Golang约定,对于可能产生错误的函数,应该在最后的return参数中返回这个错误对象。


这是一个非常有意思的模型,这让我想起了Node的内置函数。然而,就像Node一样,把会生成错误的单元测试写入到内置函数中可能会很困难。当你按照编码模式抛出错误,然后在上层处理错误时,就会变得很烦人,如下所示:



这会很快弄乱你的代码。在这一点上,有些人可能会认为interfaces和mock能解决这些问题。虽然在某些情况下是这样,但是针对内置的库(如os和ioutil)来编写大量的interfaces,或者将这些库作为参数来传递,我认为并不合适,这样做只是让我们能够合理地生成ioutil.WriteFile和os.MkdirAll的错误而已。


我认为这绝对是我心智上一个缺陷。我已经阅读了大量关于如何对Golang进行单元测试和提高代码覆盖的文档和博客文章,但是我还是没有找到一个不需要依赖注入的模式。Golang似乎很讨厌过于繁琐。


结论


我很乐意听到你的想法。我刚刚用Golang工作了几个星期,但这是一个令人难以置信的受教育并且很愉快的经历。我能够在很短的时间内从没有任何经验到开发出一个真正的产品,而不是教科书上的一个例子。我知道我并不是Golang专家,而且对于Golang的了解还存在理论上的差距,但是,当我写下这篇文章的时候,我发现自己走的比预想的要远得多。


Golang按照我原来设想的做了,给了我一个二进制文件,我不再需要Ruby解释器,可以很轻松地下载到Docker容器中。如果你还在用其他语言维护可执行程序,我建议你考虑一下Golang,给Golang一次尝试。


原文:15 Lessons in Golang 

作者:Jason Kulatunga 

翻译:雁惊寒



近期精彩

正确认识Docker、Kubernetes、Apache Mesos

阿里巴巴大数据实践之数据建模

如何能既便宜又快速地获取大数据?

浅谈分布式消息技术:Kafka

谷歌TensorFlow物理检测API,目前最好的物体识别方案?

Weiflow:微博也有机器学习框架?

如何快速全面建立自己的大数据知识体系?

最全技术图谱!一文掌握人工智能各大分支技术

深度解密今日头条的个性化资讯推荐技术

分分钟带你杀入Kaggle Top 1%

值得收藏!全球100款大数据工具汇总

Livy:基于Apache Spark的REST服务

程序员必备表情包

Spark App自动化分析和故障诊断

基于Spark的大规模机器学习在微博的应用

HBase在滴滴出行的应用场景和最佳实践

长按识别二维码享更多精彩


公众号内回复以下关键词,即可获取更多资料!

回复 CCAI ,查看2017中国人工智能大会PPT汇总

回复 CCTC ,查看历年中国云计算技术大会PPT汇总

回复 BDTC ,查看历年中国大数据技术大会PPT汇总

回复 SDCC 查看历届中国软件开发者大会PPT汇总

回复 白皮书 ,查看历年中国软件开发者白皮书汇总

回复 工具 ,查看大数据相关技术工具盘点及对比分析类文章精选汇总

回复 Spark ,查看近期Spark相关技术文章精选汇总

回复 无人驾驶系列 ,查看无人驾驶技术全系列12篇文章

回复 程序员 ,查看近期《程序员》刊载的大数据相关文章精选汇总

回复 活动 ,查看近期线上线下大数据相关活动资讯

回复 日报 ,查看「CSDN日报」每日博客精选

回复 周刊 ,查看往期Hadoop与大数据周刊精选内容

回复 程序人生 ,查看大数据技术升级之路的反思和感悟

回复 帮助 ,查看本公众号全部关键词列表

点击下方“阅读原文”查看更多
登录查看更多
5

相关内容

介绍

这本书在保持非常务实的教导和结果导向付出很大的精力。构建聊天机器人不只是完成一个教程或遵循几个步骤,它本身就是一种技能。这本书肯定不会用大量的文本和过程让你感到无聊;相反,它采用的是边做边学的方法。到目前为止,在你的生活中,你肯定至少使用过一个聊天机器人。无论你是不是一个程序员,一旦你浏览这本书,你会发现构建模块的聊天机器人,所有的奥秘将被揭开。建立聊天机器人可能看起来很困难,但这本书将让你使它如此容易。我们的大脑不是用来直接处理复杂概念的;相反,我们一步一步地学习。当你读这本书的时候,从第一章到最后一章,你会发现事情的进展是多么的清晰。虽然你可以直接翻到任何一章,但我强烈建议你从第一章开始,因为它肯定会支持你的想法。这本书就像一个网络系列,你在读完一章之后就无法抗拒下一章的诱惑。在阅读完这本书后,你所接触到的任何聊天机器人都会在你的脑海中形成一幅关于聊天机器人内部是如何设计和构建的画面。

这本书适合谁?

这本书将作为学习与聊天机器人相关的概念和学习如何建立他们的一个完整的资源。那些将会发现这本书有用的包括: Python web开发人员希望扩大他们的知识或职业到聊天机器人开发。 学生和有抱负的程序员想获得一种新的技能通过亲身体验展示的东西,自然语言爱好者希望从头开始学习。 企业家如何构建一个聊天机器人的伟大的想法,但没有足够的技术关于如何制作聊天机器人的可行性信息。 产品/工程经理计划与聊天机器人相关项目。

如何使用这本书?

请记住,这本书的写作风格和其他书不一样。读这本书的时候要记住,一旦你完成了这本书,你就可以自己建造一个聊天机器人,或者教会别人如何建造一个聊天机器人。在像阅读其他书籍一样阅读这本书之前,务必记住以下几点:

  • 这本书涵盖了构建聊天机器人所需的几乎所有内容,而不是现有内容。
  • 这本书是关于花更多的时间在你的系统上做事情的,这本书就在你身边。确保您执行每个代码片段并尝试编写代码;不要复制粘贴。
  • 一定要按照书中的步骤去做;如果你不理解一些事情,不要担心。你将在本章的后面部分了解到。
  • 可以使用本书所提供的源代码及Jupyter NoteBook作为参考。

内容概要

  • Chapter 1: 在本章中,你将从商业和开发人员的角度了解与聊天机器人相关的事情。这一章为我们熟悉chatbots概念并将其转换为代码奠定了基础。希望在本章结束时,你会明白为什么你一定要为自己或你的公司创建一个聊天机器人。
  • Chapter 2: 在本章中会涉及聊天机器人的自然语言处理,你将学习到聊天机器人需要NLP时应该使用哪些工具和方法。这一章不仅教你在NLP的方法,而且还采取实际的例子和演示与编码的例子。本章还讨论了为什么使用特定的NLP方法可能需要在聊天机器人。注意,NLP本身就是一种技能。
  • Chapter 3: 在本章中,你将学习如何使用像Dialogflow这样的工具以一种友好而简单的方式构建聊天机器人。如果你不是程序员,你肯定会喜欢它,因为它几乎不需要编程技能。
  • Chapter 4:在本章中,你将学习如何以人们想要的方式构建聊天机器人。标题说的很艰难,但一旦你完成了前一章,你会想要更多,因为这一章将教如何建立内部聊天机器人从零开始,以及如何使用机器学习算法训练聊天机器人。
  • Chapter 5:在本章中,部署你的聊天机器人纯粹是设计给你的聊天机器人应用一个最后的推动。当你经历了创建聊天机器人的简单和艰难的过程后,你肯定不想把它留给自己。你将学习如何展示你的聊天机器人到世界使用Facebook和Slack,最后,整合他们在你自己的网站。
成为VIP会员查看完整内容
Building Chatbots with Python.pdf
0
95
小贴士
相关资讯
21个必须知道的机器学习开源工具!
AI100
8+阅读 · 2019年9月13日
Python用法速查网站
Python程序员
12+阅读 · 2018年12月16日
Python | Jupyter导出PDF,自定义脚本告别G安装包
程序人生
5+阅读 · 2018年7月17日
刚开始学编程?这几款小工具能让你事半功倍
CVE-2018-7600 - Drupal 7.x 远程代码执行exp
黑客工具箱
10+阅读 · 2018年4月17日
Python为啥这么牛?
Python程序员
3+阅读 · 2018年3月30日
快乐的迁移到 Python3
Python程序员
4+阅读 · 2018年3月25日
Python NLP 入门教程
开源中国
9+阅读 · 2017年10月1日
[编程经验] CVPR2017论文全集下载代码脚本分享
机器学习和数学
7+阅读 · 2017年7月27日
相关VIP内容
专知会员服务
45+阅读 · 2020年7月1日
专知会员服务
102+阅读 · 2020年6月15日
专知会员服务
39+阅读 · 2020年4月26日
专知会员服务
88+阅读 · 2020年3月22日
【书籍推荐】简洁的Python编程(Clean Python),附274页pdf
专知会员服务
102+阅读 · 2020年1月1日
相关论文
Tactical Rewind: Self-Correction via Backtracking in Vision-and-Language Navigation
Liyiming Ke,Xiujun Li,Yonatan Bisk,Ari Holtzman,Zhe Gan,Jingjing Liu,Jianfeng Gao,Yejin Choi,Siddhartha Srinivasa
3+阅读 · 2019年3月6日
Ke Li,Jitendra Malik
5+阅读 · 2018年11月29日
Paul Henderson,Vittorio Ferrari
3+阅读 · 2018年11月15日
Video Object Detection with an Aligned Spatial-Temporal Memory
Fanyi Xiao,Yong Jae Lee
3+阅读 · 2018年7月27日
Xiaolong Wang,Abhinav Gupta
3+阅读 · 2018年6月5日
Chaitanya Malaviya,Pedro Ferreira,André F. T. Martins
3+阅读 · 2018年5月21日
Xin Wang,Yuan-Fang Wang,William Yang Wang
5+阅读 · 2018年4月15日
Kaiming He,Georgia Gkioxari,Piotr Dollár,Ross Girshick
7+阅读 · 2018年1月24日
Ali Javidani,Ahmad Mahmoudi-Aznaveh
3+阅读 · 2017年12月30日
Xiaoqiang Lu,Binqiang Wang,Xiangtao Zheng,Xuelong Li
11+阅读 · 2017年12月21日
Top