NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

用 Go 语言进行编程的利与弊

  • 2019-05-19
  • 本文字数:3049 字

    阅读完需:约 10 分钟

用Go语言进行编程的利与弊

最近,我们使用 Go 语言编写了一个 API,Go 语言是一种开源编程语言,2009 年由 Google 推出。在使用 Go 进行开发的过程中,我们得到了很多经验和心得,想跟读者们分享,于是便有了本文


在为项目选择编程语言时,我们总是建议,在考虑要使用哪种编程语言进行构建之前,先要了解这个项目将要构建的内容。让产品成为应该如何构建的决定性因素。


下面就是我们在使用 Go 语言进行开发时发现的一些利弊,这些可以帮助你了解 Go 语言是否适合用于构建你的下一个项目。

我们喜欢 Go 语言的地方

近年来,Go 语言的使用量呈爆炸式增长。似乎每个初创公司都将它用于后端系统。开发人员认为它如此广受欢迎,背后的原因有很多。

Go 语言速度非常快

Go 语言是一门非常快速的编程语言。因为 Go 语言是编译成机器码的,因此,它的表现自然会优于那些解释性或具有虚拟运行时的编程语言。Go 程序的编译速度也非常快,并且生成的二进制文件非常小。我们的 API 在短短几秒钟内就编译完毕,生成的可执行文件区区只有 11.5MB 这么小。

易于掌握

与其他语言相比,Go 语言的语法很简单,很容易掌握。你完全可以把 Go 语言的大部分语法记在脑子里,这意味着你并不需要花很多时间来查找东西。Go 语言也非常干净易读。非 Go 语言的程序员,尤其是那些习惯于 C 风格语法的程序员,就可以阅读 Go 程序代码,并且能够理解发生什么事。

静态类型定义语言

Go 语言是一种强大的静态类型定义语言。有基本类型,如 int、byte 和 string。也有结构类型。与任何强类型语言一样,类型系统允许编译器帮助捕获整个类的错误。Go 语言还具有内置的列表和映射类型,而且它们也易于使用。

接口类型

Go 语言有接口类型,任何结构都可以简单地通过实现接口的方法来满足接口。这允许你解耦代码中的依赖项。然后,你可以在测试中模拟你的依赖项。通过使用接口,你可以编写更加模块化的可测试代码。Go 语言还具有头等函数,这使得开发人员以更实用的方式编写代码成为可能。

标准库

Go 语言有一个相当不错的标准库。它提供了方便的内置函数,用于处理基本类型。有些包可以让你轻松构建一个 Web 服务器、处理 I/O、使用加密技术以及操作原始字节。标准库提供的 JSON 序列化和反序列化非常简单。通过使用“tags”,你可以在 struct 字段旁边指定 JSON 字段名。

测试支持

测试支持内置在标准库中,不需要额外的依赖。如果你有个名为 thing.go 的文件,请在另一个名为 thing_test.go 的文件中编写测试,并运行“go test”。Go 就将快速执行这些测试。

静态分析工具

Go 语言的静态分析工具众多且强大。一种特别的工具是 gofmt,它根据 Go 的建议风格对代码进行格式化。这可以规范项目的许多意见,让团队奖经理集中在代码所做的工作上。我们对每个构建运行 gofmt、golint 和 vet,如果发现任何警告的话,则构建将会失败。

垃圾收集

在设计 Go 语言时,有意将内存管理设计得比 C 和 C++ 更容易。动态分配的对象是垃圾收集。Go 语言使指针的使用更加安全,因为它不允许指针运算。还提供了使用值类型的选项。

更容易的并发模型

虽然并发编程从来就不是一件易事,但 Go 语言在并发编程要比其他语言更容易。创建一个名为“goroutine”的轻量级线程,并通过“channel”与它进行通信几乎是非常简单的事情,至于更为复杂的模型,也是有可能能够实现的。

我们不喜欢 Go 语言的地方

正如我们前面讨论过的,Go 语言确实是一门优秀的语言。它有一个干净的语法,执行速度也很快速。它还有很多优点。但是,编程语言的全部并不仅仅是指它的语法。下面是我们遇到的一些问题。

没有泛型

首先,这个问题就像房间里的大象一样,是显而易见而又被忽略的事实。Go 语言没有泛型。对于来自使用 Java 这样的语言的开发者来说,要转向 Go 语言,这是一个需要克服的巨大障碍。这意味着代码的重用级别降低了。虽然 Go 语言有头等函数,但如果编写“map”、“reduce”和“filter”等函数,将这些函数设计为对一种类型的集合进行操作,就不能将这些函数重用于其他不同的类型集合。要解决这一问题有很多方法,但都最终都要涉及到编写更多的代码,如此一来,生产力和可维护性就降低了。

接口是隐式的

虽然有接口这一点很好,但是结构却是隐式地而非显式地实现接口。这点被称为是 Go 语言的优势之一,但我们发现,很难从结构中看出它是否实现了接口。你只能通过尝试编译程序才能真正了解。如果程序很小,这当然没有什么问题。但如果这个程序是中大型规模,麻烦就大了。

库支持不佳

Go 语言的库支持参差不齐。我们的 API 与 Contentful 集成,但后者并没有官方支持的 Go SDK。这意味着我们必须编写(并维护!)大量代码来请求和解析 Contentful 中的数据。我们还必须依赖第三方的 Elasticsearch 库。由厂商提供的 Go SDK 并不像他们的 Java、Ruby 或 JavaScript 同类产品那样受欢迎。

社区沟通很难

Go 社区可能不会接受建议。在 golint 的 GitHub 存储库中考虑这个问题:https://github.com/golang/lint/issues/65 ,有用户请求 golint 在发现警告时,能够使构建失败(这就是我们在项目中所做的事情)。维护者立即否定了这一想法。但是,由于有太多的人就这个问题发表了评论,一年后,维护者最终不得不增加了所请求的特性。


Go 社区似乎也不喜欢 Web 框架。虽然 Go 语言的 HTTP 库涵盖了很多方面,但它并不支持路径参数、输入检查和验证,也不支持 Web 应用程序中常见的横切关注点。Ruby 开发人员有 Rails,Java 开发人员有 Spring MVC,Python 开发者有 Django。但许多 Go 开发人员选择了避免使用框架。然而现实是,并非没有框架,恰恰相反有很多。但是,一旦你开始将某个框架用于某个项目,要想避免被遗弃的命运几乎是不可能的。

分裂的依赖关系管理

很长一段时间以来,Go 语言没有一个稳定的、正式的包管理器。经过多年的社区乞求,Go 项目最近才发布 godep。在此之前,已经有许多工具填补了这个空白。我们在项目中使用了非常强大的 govendor,但这意味着社区是分裂的,对刚接触 Go 语言的开发人员来说,这可能是非常令人困惑的。此外,几乎所有的包管理器都由 Git 存储库提供支持,Git 存储库的历史可能随时会发生更改。将其与 Maven Central 相比,后者永远不会删除或更改项目所依赖的库。

决定是否使用 Go 语言

有时候,你需要考虑一下机器的情况。你发送和接受字节时。你管理数千个并发进程时。你也有可能正在编写操作系统、容器系统或区块链节点。在这些情况下,很可能你不会关心泛型。因为你忙着从芯片榨取每纳秒的性能。


但是,很多时候,你需要考虑人类。你需要处理的业务领域数据:客户、员工、产品、订单。你需要编写对这些域实体进行操作的业务逻辑,并且需要多年来维护此业务逻辑。并且需要处理不断变化的需求,还要做的越快越好。对于这些情况,开发人员的经验很重要。


Go 语言是一种编程语言,它更重视的是机器时间而不是人类时间。有时候,你的领域中,机器,或者程序性能是最关键的。在这些情况下,Go 可以成为一个很好的 C 或 C++ 替代品。但是,当你编写一个典型的 n 层应用程序时,性能瓶颈通常会出现在数据库中,更重要的是,你将如何对数据建模。


在决定是否使用 Go 语言时,请考虑以下经验法则:


如果你处理的是字节,那么 Go 语言可能是一个不错的选择。


如果你处理的是数据,那么 Go 语言可能不是一个好的选择。


这种情况也许在未来有一天会改变。Go 语言和社区仍然还很年轻。他们可能会给我们带来惊喜,并添加泛型;或者一个流行的 Web 框架会大获全胜。不过,目前我们将坚持使用成熟的编程语言,这些语言具有普遍的支持、成熟的依赖性管理,并专注于业务领域建模。



公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2019-05-19 14:0716685
用户头像

发布了 526 篇内容, 共 242.0 次阅读, 收获喜欢 1545 次。

关注

评论 4 条评论

发布
用户头像
在考虑要使用哪种编程语言进行构建之前,先要了解这个项目将要构建的内容。让产品成为应该如何构建的决定性因素。
2021-12-12 11:59
回复
用户头像
新版本 golang,上述部份不足已有支援了
2019-05-27 16:25
回复
用户头像
我在学习go语言时发现go get命令没有进度显示,然后从github上的issue搜索到了好多个对于此问题的讨论,但是从讨论结果来看,go社区从最初到现在依然坚持不添加进度反馈,并且将unix哲学奉为至理。go语言对于包的导入一直令我困惑,对于GOPATH、vendor、项目中的包等这些的导入规则我并没有找到一个统一清晰的说明,社区似乎也没有进行统一的梳理
2019-05-27 11:25
回复
用户头像
这个是老文章了,看法有点过时
2019-05-20 10:31
回复
没有更多了
发现更多内容

《数字经济 科技向善》大咖对谈干货来啦

易观分析

金融科技

Redis总结:缓存雪崩、缓存击穿、缓存穿透与缓存预热、缓存降级

程序员啊叶

Java 编程 程序员 架构 java面试

延迟队列DelayQueue性能测试

FunTester

基于 Spring Cloud 的微服务架构分析

程序知音

Java 程序员 微服务 SpringCloud 后端技术

语音直播系统——提升云存储安全性的必要手段

开源直播系统源码

直播系统源码 语音直播系统 语音直播系统连麦

「行话」| 汽车软件如何高效交付?我们总结了这三个关键点

极狐GitLab

git DevOps gitlab DevSecOps 汽车

Go语言系列:如何搭建Go语言开发环境?

小黑豆豆

后端 安装 教程 Go 语言 签约计划第三季

责任链模式在转转精准估价中的应用

转转技术团队

设计模式 责任链

湖仓一体电商项目背景与架构介绍及基础环境准备

Lansonli

大数据项目 7月月更 签约计划第三季 湖仓一体电商项目

纯css实现:文字可换行的下划线、波浪线等效果

南极一块修炼千年的大冰块

7月月更

500强企业如何提升研发效能?来看看行业专家怎么说!

万事ONES

什么是Tor?Tor浏览器更新有什么用?

郑州埃文科技

TCP/IP tor 洋葱路由

详解分布式系统的幂等

焱融科技

分布式系统 存储 文件存储 幂等性

阿里P8熬了一个月肝出这份32W字Java面试手册,在Github标星31K+

程序员啊叶

Java 编程 程序员 架构 java面试

初学者入门:使用WordPress搭建一个专属自己的博客

hum建应用专家

数据库 Wordpress 博客部署 WordPress

2022 秋招 Java 岗面试高频问题总结

程序员啊叶

Java 编程 程序员 架构 java面试

2022最新首发!这份Spring核心知识笔记让你彻底学明白

了不起的程序猿

程序员 java 14 Spring Boot CLI

Mall微服务版本全面升级!支持最新版SpringCloud

程序知音

Java spring 编程 程序员 后端技术

企业运维安全就用行云管家堡垒机!

行云管家

网络安全 运维安全 运维堡垒机 企业数据安全

技术实践干货 | 从工作流到工作流

观远数据

工作流 workflow

常见分布式理论(CAP、BASE)和一致性协议(Gosssip、Raft)

程序员啊叶

Java 编程 程序员 架构 java面试

万字详解 Google Play 上架应用标准包格式 AAB

融云 RongCloud

Google 安卓

兆骑科创创业大赛策划承办机构,双创平台,项目落地对接

兆骑科创凤阁

阿里经典30道Java面试题,看完记得收藏保存

程序员啊叶

Java 编程 程序员 架构 java面试

Flink消费kafka消息实战

程序员欣宸

Java flink 7月月更

2022年中国网络视频市场年度综合分析

易观分析

数据分析 数字媒体 市场

别再用 System.currentTimeMillis 统计耗时了,太 Low,试试 Spring Boot 源码在用的 StopWatch吧,够优雅!

沉默王二

Java

云管平台中租户以及多租户概念简单说明

行云管家

云计算 云管平台

Gartner 权威预测未来4年网络安全的8大发展趋势

SEAL安全

安全 趋势 预测

如何开发一款基于 Vite+Vue3 的在线Excel表格系统(上)

葡萄城技术团队

前端 vite vue3.0

单机高并发模型设计

C++后台开发

reactor 高并发 线程池 C/C++后台开发 C/C++开发

用Go语言进行编程的利与弊_语言 & 开发_Samuel Jones_InfoQ精选文章