想学新的编程语言?考虑下Go吧
作者 | Lewis Fairweather
译者 | 弯月,责编 | Elle
来源 | CSDN(ID:CSDNnews)
【导读】快速的运行时、高效的并发、简单易学的语法,这些都是Go语言最吸引人的特性。
以下为译文:
Go语言的入门门槛之低令我感到惊讶。
刚开始学习Go时,我就用它开发了一个个人项目,我强迫自己熟悉它的语法(每次学习新语言时我都会开始新的项目)。
我决定建立一个命令行应用程序,能够列出所有子域名,帮助我的bug赏金活动。因此,该应用程序需要同时发送多个HTTP请求,有点像gobuster,但我希望重新发明这个轮子,并添加一些功能,如抓取HTML响应内容,以找到我关心的安全相关的信息。
问题是我想用Go-routines来解决。由于需要发送的HTTP请求数是位置的,所以我需要了解怎样才能有效地处理这些请求。
第一印象
刚上手Go语言我就觉得它的语法非常熟悉,而在这之前我甚至连文档都没看过。那些概念对我而言似乎非常直观(也许别人会有不同的意见)。defer的用法也非常合理。用于解决字符串格式的fmt包似乎解决了我之前甚至不知道的问题。我开始体会到为什么Go语言开发者要开发一门新语言。所以我决定深入到Go的最初目的,来判断它是否值得学习。
为什么要开发Go
目标
Google开发Go语言的初衷就是让多进程处理的开发更高效、更安全,从而改善服务器软件的可维护性、可靠性和可验证性。Go语言是Google面对自己遇到的大数据处理(这也是Google目前最流行的功能之一)方面的超长编译时间等问题交出的答卷。他们需要一种语言,该语言的重点在于可扩展性、可读性和并发性。Go语言从诞生起就避免了其他语言必须面对的这些烦恼。Go语言的发明者们从其他语言中吸取了最需要的概念,然后进行改进,再合并到一起,形成了Go语言。例如fmt包就是个非常高效的字符串处理工具:
“fmt实现了I/O的格式化,提供了类似于C语言的printf和scanf的函数。格式的‘动词’的概念是从C语言继承的,但要简单得多。”
fmt就是一个从流行的成功预言(如C语言)吸取并改进的例子。
Go的并发采用了CSP的模型,使用通道(channel)避免了同步共享数据。他们认为这样进行通信更简单、更安全。
另一个重点就是简单性。Go语言需要一种有偏向性的编程风格,于是Go社区构建了这种风格额,称为go style。这个风格贯穿所有项目,从而减少在配置lint规则和学习不同编程风格所花费的时间,这对于团队是非常重要的。
“理论上这能够减少开发者之间的代码风格和实现风格的差异,这些现象在其他语言(如JavaScript,它需要使用大量的Eslint规则)中很常见。”
Go语言的方法
Go语言采用的方法结合了动态类型的解释语言的易用性,以及静态类型的编译语言的效率和安全性。它有int、byte和string等基本类型,也有内置的maps类型,还有指针。正交原则是Go开发中的一个重要原则,它是函数式方法的基础。
GO使用结构(structs)表示数据,使用用户接口来表示抽象。人们一直在争论Go是否是面向对象的。如果你是Java开发者,那么你第一眼很难在Go语言中看到面向对象的东西。这是因为你在寻找类型层次结构,而实际上Go的类型没有层次结构。它只有structs,不能继承,但却是对象风格的。只是与继承相比,Go更倾向于使用组合。你可以通过接受接口来实现多态。接口可以被任何符合该接口的类型对象接受。
除了这些核心概念之外,Go还意识到现代的多核心处理对于并发的需求。强并发通过goroutines和通道实现。在大型并发程序中,自动垃圾回收和高效的内存管理同样重要。单元测试也非常简单,只需在源代码同一目录下使用_test.go前缀编写文件即可。
为什么要学习Go语言?
并发
并发是刻在Go语言骨子里的。它是一等公民,而且非常容易使用,只需要用go关键字给函数加上前缀即可。goroutines是低成本、轻量级的线程执行。在Go语言中实现并发非常简单。只需要用go关键字生成一个新的线程,该线程在同一个线程组内可以在多个核心上共享。Goroutine只有几KB大小,由Go运行时负责处理,它会将goroutines移动到不同的可运行的线程上,以避免阻塞。因此,执行是异步的,而且非常快;几乎和C/C++一样快。你可以使用通道来控制goroutines的数量,尽管用起来感觉像是同步的,但实际上是异步的。
Go运行时使用可变大小的、有界的栈,因此栈可以更小。运行时会改变存储栈的内存区域的大小。同一个地址空间内可以运行几十万个goroutines。
简单
Go语言开发时采用了极简方式。没有类,也没有集成。所有这些流行语言(如Java、Python)等的功能都用structs代替。Go是强类型、静态类型语言。它鼓励在任何地方使用接口。静态类型的目标是减少编译时错误。也让语言更容易学习。
在其他语言如JavaScript中,你必须在多种方式、范式和惯例中做出抉择,但使用Go,就只需遵守唯一的一种被所有人接受的代码规范。这样,在团队中分析和论证代码就非常容易,集成也会更顺畅。
尽管没有隐式转换,但带来的语法额外开销依旧非常小。这样产生的代码更易读、复杂度更低。
速度快
编译器是静态连接的。这样在编译生成二进制可执行文件时无需处理外部依赖。代码会编译成由机器代码组成的可执行文件,运行时无需使用虚拟机,因此速度更快、更便携,尽管尺寸会增大。
而且,Go语言的其他方面也很快:比如前面说过的编译速度,以及生产环境上线的事件。Go语言专注于开发者的生产力,这主要归功于它的简单性。因此从初始创意到生产环境上线的速度很快。
Go语言有什么问题?
没有泛型
这一点众说纷纭。使用泛型的语言(如Java)能大幅度地增强代码的可复用性,同时保证类型安全。Go社区已经提出了这个问题,并且在考虑中。但是,Go团队目前的态度是,泛型带来的好处并不能超过没有泛型时的简单性和可阅读性。
竞争条件
“不要使用共享内存进行通信,应该使用通信来共享内存。”
这条原则虽然带来了好处,但也让Go更容易产生竞争条件。
由于Go的结构是可修改的(而且没有不可修改的数据结构),开发者只能在多个并发进程之间共享可修改的数据。举个例子,你可以将指针发送到通道,而不需要做深度拷贝,而数据的可修改性就可能导致竞争条件。通道也可以改善并发编程,但竞争条件的确存在,而且通道并没有办法防止它发生。
不过,Go CLI内置了一个竞争条件检测器,来帮助检测竞争条件。
错误检查
错误检查必须显式进行。Go语言没有try-catch语句。因此,你必须改变错误处理的思路,特别是在你早已习惯了其他语言的情况下。Go语言团队认为,不使用异常可以避免造成过度复杂的代码,也可以避免重载返回值。这与Go语言追求简单时一直的。不过,在确实必要的时候你可以使用panic和recover来处理异常。而且还有个正统的error接口类型,会通过Error()返回一个错误字符串。
Go语言的开发者采用了多值返回值来检查错误。某个可能会产生错误的函数可以返回一个错误。通常需要用if err != nil的写法污染代码。
对于某些人来说可能太简单了?
简单是有代价的。Go不像JavaScript那样有丰富的表现形式。Go语言没有默认值。它还缺乏抽象,缺乏泛型,因此实现DRY原则变得非常困难、非常不直观。
要知道的是,Go语言依然很年轻。泛型在考虑中,随着Go语言不断成熟,以后还会有更大的考虑空间。社区在努力开发并改进Go语言。就像任何语言一样,Go有自己的优势和弱点。我肯定,如果足够多的Go程序员认为某个语言特性很重要,那么这个特性肯定会被实现。
但是,尽管似乎缺乏一些语言特性,但有时候只需要从不同的角度考虑问题即可。
通常,问题总有另一种更适合Go语言的方式来解决。
什么时候使用Go
我们可以认为,目前Go语言并不能解决所有问题,特别是与GUI有关的问题,另外还需要大量抽象的复杂系统。
但又有哪个语言能解决一切问题呢?
我们应该取其所长。如果你认为Go语言太简单,很难用干净的方式增加复杂性,那么就应该用它来构建简单的微服务,而不是用来构建复杂的系统。使用Go构建网络工具和系统工具,而不应该用它来代替更适合某项任务的语言。
所以最重要的是,根据自己的需要选择最合适的工具。如果Go适合你的需求,那么就选择Go,因为这就是Go的优势所在。
所以现在就开始学起来吧。
原文地址:
https://medium.com/swlh/want-to-learn-a-new-programming-language-consider-go-golang-1c32dc3788ba
(*本文为AI科技大本营转载文章,转载请联系作者)
推荐阅读
千万用户同时在线,优酷智能档在双11“猫晚”直播如何防卡顿?
人工智能尴尬的2019:需要钱却没钱可烧了
不要让 Chrome 成为下一个 IE
通向人工智能产业落地化的道路在哪?
OPPO 物联网开放之路
把自己朝九晚五的工作自动化了,有错吗?
迎风而来|刮向央视的这朵云是什么来头?
量子通信,到底是什么工作原理?
这三名男子靠开加密矿池获得7.22 亿美元,却不兑现收益拿去奢侈挥霍……
你点的每个“在看”,我都认真当成了AI
相关文章:

oracle学习总结三(bulk collect用法)
通过bulk collect减少loop处理的开销发表人:logzgh | 发表时间: 2006年五月19日, 10:56采用bulk collect可以将查询结果一次性地加载到collections中。而不是通过cursor一条一条地处理。可以在select into,fetch into,returning into语句使用bulk collect。注意在使用bulk coll…

MQTT的学习研究(五) MQTT moquette 的 Blocking API 发布消息服务端使用
参看官方文档: http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0/index.jsp?topic/com.ibm.mq.amqtat.doc/tt00000_.htm * Java 为 MQ Telemetry Transport 创建异步发布程序 *在此任务中,您将遵循教程来修改第一个发布程序。通过修改,…

WMI技术介绍和应用——查询驱动信息
本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。 如何使用WMI查询所有驱动信息?(转载请指明出于breaksoftware的csdn博客) CSynQueryData recvnotify(L"root\\CIMV2",L"SELECT * FR…

NumericUpDown
NumericUpDown控件主要功能是为一个TextBox控件添加上下按钮,当单击按钮时实现数字的加减,同时也可以提供静态数据,实现这些数据的上下选择。 属性列表: TargetControlID:该控件的目标作用控件。 Width&…
提高建模效率,改变手工作坊式生产,AutoML的技术研究与应用进展如何了?
整理 | 王银出品 | AI科技大本营(ID:rgznai100)【导读】12 月 5-7 日,由中国计算机学会主办,CCF 大数据专家委员会承办,CSDN、中科天玑协办的中国大数据技术大会(BDTC 2019)在北京长城饭店隆重举…

.net使用memcached
Windows中memached安装 -------------服务器端配置 1>开始>运行:CMD(确定) 2>cd C:\memcached(回车) 3>memcached -d install(回车 这步执行安装) 4>memcached -d start(回车 这步执行启动memcache服务器,默认分配64M内存&…
22张精炼图笔记,深度学习专项学习必备
作者 | DL&CV_study9编辑 | Elle来源 | CSDN 博客本文为人工智能学习笔记记录。【深度学习基础篇】一、深度学习基本概念监督学习:所有输入数据都有确定的对应输出数据,在各种网络架构中,输入数据和输出数据的节点层都位于网络的两端&…

WMI技术介绍和应用——查询文件夹信息
本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。 本节主要介绍Win32_Directory类。通过该类我们将可以获得部分常用的文件夹信息。在该类中,有属性Name&#x…

CSLA .NET概述
CSLA是Component-based, Scalable, Logical Architecture的简写,CSLA .NET是Rockford Lhotka基于.Net设计的一套N-tier分布式框架。 CSLA .NET包含如下功能: l n-Level undo capability 译:n层撤销功能 l Tracking broke…

简短的几句js实现css压缩和反压缩功能
写在前面 最近一直在整理css,但因为现在Visual Studio 2013太智能了,它每每在我按ctrlED进行格式化代码的时候,就会将css进行层次格式化(如下图所示),而这个格式让我老大实在无法忍受,我老大认为…
迁移学习前沿研究亟需新鲜血液,深度学习理论不能掉链子
作者 | Frederico Guth,Tefilo Emidio de Campos编译 | 夕颜出品 | AI科技大本营(ID:rgznai100)【导读】人类可以从很少的样本中学习,显示出了人类卓越的泛化能力,而这一点学习算法仍远做不到。当前,最成功的模型需要大量标记好的…

WMI技术介绍和应用——查询磁盘分区和逻辑磁盘信息
本文使用了《WMI技术介绍和应用——使用VC编写一个半同步查询WMI服务的类》中代码做为基础。本节只是列出了WQL语句,具体使用参看前面的例子。(转载请指明出于breaksoftware的csdn博客) 本节主要介绍Win32_DiskPartition和Win32_LogicalDisk两…

用 jQuery 的 AJAX 功能发现的一个错误/注意点:HTTP Error 411
今天程序中有个地方需要 Ajax 方式 POST 数据,发现在 IE 6.0 下正常,而 FireFox 2.0.0.9 下则出错。通过 FireBug 抓取 ajax 回发后得到的页面信息如下:HTTP Error 411 - Length required 经过 google 搜索发现,这个 HTTP 状态码对…

jquery 取消 radio checked 属性,重新选中的问题解决
<input type"radio" name"test"/> <input type"radio" name"test" id "input2"/> (说明:使用的jquery 版本是 1.10.2。) 使用 jquery 的removeAttr(),清除掉 radio 的checked属性后。使用 attr(…

使用×××版软件中常见的一些错误代码
1、错误代码(691):由于域上的用户名或密码无效而拒绝访问。如果是使用的易游提供的服务器,请在帐务系统确认使用的帐号是否状态正常,刚设置好的帐号需要等5分钟才能使用。如果是外部服务器请直接找服务器提供商。2、错…
程序员在地铁写代码遭疯狂吐槽!网友:装什么装
01作为了解程序员这个行业的人来说程序员的工作真的很累加班已经成为他们的标签有的时候网站出事或者需求比较紧急的时候可能路边也是他们的工作场地所以这个时候对于程序员们的工作来说也是不分场合的02之前看到网上有人拍到程序员在地铁上写代码的照片并将之发到网络上 图片一…

如何定制一款12306抢票浏览器——构架
快春节了,火车票一票难求。虽然黄牛市场冷淡了,但是互联网“娱乐界”却越来越闹腾了。先是猎豹等浏览器推出抢票专版(插件),然后是铁道部约谈金山,之后流传工信部叫停抢票插件,之后再是工信部出…
一些链接, 关于不可变数据
这篇笔记介绍不可变数据, Persistent Data Structure 和 Immutable. 但是不深入数据结构实现, 函数式编程理论. 定义 https://en.wikipedia.org/wiki/Persistent_data_structure In computing, a persistent data structure is a data structure that always preserves the pre…
囚犯学会编程之后会发生什么?
作者 | Simone Stolzoff译者 | 苏本如,责编 | 郭芮出品 | CSDN(ID:CSDNnews)【导读】Slack是硅谷一家多元化的公司,它雇佣了三名以前被监禁的程序员。但事实上,当一个人从监狱获释时,监禁的耻辱…

如何定制一款12306抢票浏览器——用户界面
用户界面 我不打算写个Windows界面。因为这个软件的全部就是个浏览器。我准备将”浏览器“进行到底,所以我选择使用html作为我们的用户界面。我也并不打算从头开始写一个浏览器,我使用了《内嵌IE网页窗口中消除IE默认脚本设置影响的方法》中基于WTL的浏览…

Study on Android【四】--显示控件使用
Android的界面显示同样也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的样式来做的。具体细节不想说了,可以参考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI这篇Doc。其他还有很多&#x…

修改Vim配色方案
1. 查看备选的配色方案/usr/share/vim/vim74/colors2. 查看当前使用的配色方案在命令模式下输入 :colorscheme可见当前使用的配色方案为ron3.选择和设置配色方法编辑 ~/.vimrc文件,如选择ron.vim对应的配色方案,则添加 colorscheme ron4. 设置某项颜色--…

如何定制一款12306抢票浏览器——启动“人”线程
启动“人”线程 在《如何定制一款12306抢票浏览器——构架》一文中,我们提到“人”线程。对于熟悉Window编程的同学来说,线程间通信和信息传递不是难题。但是由于浏览器和我们“人”线程之间传递的是COM对象,这个过程就没有那么简单了。&…

看看你是《老朋友》(青春六人行)里的哪一个
(点击“which friends character are you?”连接可以进入问卷页面) Which Friends Character Are You? You are Rachel. Youre very selfish and pay great attention to image. Spoiled when you were young, you were always the popular and sn…

360金融沈赟:只有适配实践的技术才能实现价值掘金
金融科技应用的新场景、新需求层出不穷,已成为创新技术的理想“试验田”。然而当“创新”浪潮褪去,行业回归审慎与冷静后不难发现,并非所有创新技术都会深入金融土壤。对此,360金融首席数据科学家沈赟认为,只有适配实践的技术才能…

swift(一)基础变量类型
import Foundationprintln("Hello, World!")/*int a; */ var a 10 //隐式类型转换 a 9 println(a)let b 10 println(b)/* 类型标注 *///var x:Int //x 10.3不支持隐式转换let x: Int 10/* 名称不用在符合标示符的规范 */ let 常量 10/* 基本数据类型࿱…

如何定制一款12306抢票浏览器——实现自动查询和预订功能
检查是否进入订票页面 判断是否进入订票页面,我是确定了两个标准:(转载请指明出于breaksoftware的csdn博客) 1 网址是否为http://www.12306.cn/mormhweb/kyfw/ 2 该页面否有查询按钮 BOOL CDeal12306WebPage::IsQueryPage( CComPt…

以数据为中心,立足六大技术支柱,英特尔推动神经拟态计算、量子计算前沿探索
近日,英特尔中国研究院院长宋继强围绕 “英特尔如何构建技术基石,驱动未来计算”为主题做了演讲。他阐述了英特尔将坚持“以数据为中心”的目标,并指出依托于XPU产品组合,英特尔通过异构整合和oneAPI软件平台来推动实现超异构计算…

Fedora 7 播放器totem
说实话,我喜欢这个东东,简约而不简单。我以前一直用mplayer,不过还是喜欢totem的长相。很多人说不能播放,可以这么做,让它支持全部(用mplayer的codecs):(1)首先将系统已有的totem移去 # yum remove totem(2…

如何定制一款12306抢票浏览器——处理预订页面和验证码自动识别功能
判断是否进入预订页面我们先看一下预订页面的结构(转载请指明出于breaksoftware的csdn博客)可以见得,这个页面也是嵌入了两个IFrame。关于IFrame的跨域问题,我已经在前一篇文章中讲述了解决办法。我判断是否是预订页面是通过两个依…