1.掌握戈兰语是怎样的体验?
如果你懂任何一门编程语言,在Go语言之旅中学习几个小时就能掌握大部分Go的语法,几天后就能写出你的第一个真正的程序。阅读并理解实际的围棋编程,浏览“包文档”,玩网络工具包如Gorilla或Go Kit,你就会成为一个相当优秀的围棋开发者。
这是因为围棋的首要目标是简单。当我开始学习Go的时候,它让我想起了我第一次发现Java的时候:一种简单的语言和丰富但不臃肿的标准库。相对于现在繁重的Java环境,学习围棋是一种耳目一新的体验。由于Go的简单性,Go程序可读性很强,虽然错误处理增加了一些麻烦(更多内容在下面)。
Go语言的简单性可能是错误的。引用Rob Pike的话,简单是复杂的,我们会看到简单的背后有很多陷阱等着我们去踩,极简主义会让我们违背干的原则(不要重复自己)。
基于goroutines和通道的简单并发编程
Goroutines可能是围棋最好的特点。它们是轻量级计算线程,与操作系统线程有很大不同。
当Go程序执行一个看似阻塞I/O的操作时,实际上,Go运行时会挂起goroutine,并在一个事件表明结果可用时恢复它。与此同时,其他goroutines已被安排执行死刑。因此,在同步编程模型下,我们具有异步编程的可伸缩性优势。
go routine也是轻量级的:它们的栈随着需求而增长和收缩,这意味着拥有100甚至1000个go routine不成问题。
我之前的应用有一个goroutine漏洞:这些go routine在结束之前都在等待一个通道关闭,而这个通道永远不会关闭(常见的死锁问题)。这个进程无缘无故吃了90%的CPU,检查expvars显示有600 k空闲的goroutines!我猜goroutine调度程序占用了CPU。
当然,像Akka这样的Actor系统可以轻松处理数百万个Actor,部分原因是Actor没有栈,但它们远不是像goroutines那样简单地编写大量并发请求/响应应用程序(即http APIs)。
通道是goroutines的通信方法:它们提供了一个方便的编程模型,可以在goroutines之间发送和接收数据,而不依赖于脆弱的底层同步原语。渠道有自己的一套使用模式。
但是,必须仔细考虑通道,因为大小错误的通道(默认情况下没有缓冲区)会导致死锁。正如我们也将在下面看到的,通道的使用不能停止竞争情况,因为它缺乏不变性。
丰富的标准库
Go的标准库非常丰富,尤其是所有与网络协议或API开发相关的内容:http客户端和服务器、加密、文件格式、压缩、发送邮件等等。甚至有一个html解析器和一个相当强大的模板引擎来生成文本& amp;Html,这将自动过滤XSS攻击(如其在雨果的使用)。
各种API一般都比较好理解。它们有时看起来过于简单:这部分是因为goroutine编程模型意味着我们只需要关心“看似同步”的操作。这也是因为有些通用函数也可以代替很多特殊函数,就像我最近发现的时间计算的问题。
围棋性能超群
Go编译成本地可执行文件。许多Go用户来自Python、Ruby或Node.js,这对他们来说是一种令人兴奋的体验,因为他们看到服务器可以处理的并发请求数量大大增加了。当你使用非并发(Node.js)或被全局解释器锁定的解释语言时,这实际上是很正常的。再加上语言的简洁,这就解释了为什么围棋让人激动。
但是,与Java相比,在最初的性能基准测试中,情况并不那么清楚。在内存使用和垃圾收集方面打败Java。
Go的垃圾收集器是为了优先处理延迟和避免停机而设计的,这在服务器中尤为重要。这可能会导致更高的CPU成本,但是在水平可伸缩的架构中,这可以通过添加更多的机器来轻松解决。记住,Go是谷歌设计的,他们从来不缺资源。
与Java相比,Go的垃圾收集器(GC)需要做的事情更少:切片是一个连续的数组结构,而不是Java那样的指针数组。同样,Go maps也使用小数组作为桶来达到同样的目的。这意味着垃圾收集器的工作量减少了,CPU缓存也更好地本地化了。
Go在命令行实用工具上也优于Java:作为本地可执行文件,Go程序没有启动消耗,而Java需要先加载和编译字节码。
在语言级别定义源代码的格式。
在我的职业生涯中,一些最激烈的争论是关于团队代码格式的定义。Go通过定义代码的规范格式解决了这个问题。该工具会重新格式化您的代码,并且没有选项。
不管你喜不喜欢,它定义了如何格式化代码,一次性解决了这个问题。
标准化测试框架
Go在其标准库中提供了一个很好的测试框架。它支持并行测试和基准测试,并包含许多实用程序,可以轻松测试网络客户端和服务器。
万向平台围棋程序操作简单。
相对于Python,Ruby或者Node.js,运维工程师要安装一个单独的可执行文件简直是做梦。随着Docker的使用越来越多,这个问题变得越来越少,但是独立的可执行文件也意味着Docker镜像很小。
Go还内置了一些观察功能,可以用包发布内部状态和指标,添加新内容也很容易。但是要小心,因为它们在默认的http请求处理程序中是自动公开的,不受保护的。Java也有类似的JMX,但是要复杂得多。
2.2019年Go语言还有前途吗?适合入门吗?
在我看来,Golang是一种很有前途的语言。我有我的理由敢这样说。每个人的看法都不一样,但这很正常。重要的是说出你的理由,你的理由。
那么,我该如何分析Go语言是否流行,未来前景如何?
一方面取决于它的语言和自身的硬件实力,另一方面也有很多外部条件起到了关键作用。
语言硬实力
Go语言不同于传统的OO语言。它是一种基于C的语言。
如果你学过C,你会知道C的语法非常简单易学。对于师范类的人来说,入门编程基本都是从c开始的,师范因为语法特点少,很容易学。
面向对象编程发展了这么多年,编程语言变得越来越复杂。Go就简单多了,它强调组合编程。基于接口的编程是我最喜欢的事情之一。
对并发编程的语言级支持是Go受欢迎的重要原因。它简化了编写并发程序的难度,强调并发编程是为了通信,而不是为了共享内存。goroutine是一个并发单元,非常容易使用。
当然围棋的特点不止这些,我就不多说了。这些只是我的感受。
否则
语言的硬实力是底层基础,但如果认可和推广,没有优秀的项目产品,语言再牛逼也没用。
Go语言是google工程师开发的,就不介绍给三大牛了。网上有很多信息,你可以自己去查。很多人说他们老古板,照搬C的那套,让编程语言的发展倒退了。不知道有没有道理,但我喜欢这一套想法是最真实的感受。
有很多优秀的项目,最著名的就是Docker、kubernetes等云相关的项目。还有更多数据库,区块链没有列出。
一个只发展了十年的语言,在某些领域(比如云原生)有着其他语言无法撼动的地位。如果围棋没有前景,就要想一想在这个领域有什么语言能做得这么好。
人们常说围棋在中国很受欢迎。今年才开始学围棋,因为基本功还不错。学习围棋一个月后,开始写文章,在网上分享,其实主要是为了自己总结。渐渐的,我发现了一件事。围棋在中国的普及,离不开一批热衷于围棋的布道者,他们不遗余力地传播自己学习和使用围棋的经验。我很幸运能加入他们。
入门学习
适合入门吗?没有一概而论,不同的人,答案也不是唯一的。
对于没有编程基础的人来说,我觉得Go语言很适合你学习,它来源于C,同时经过了很多优化和改进。围棋要学的语法知识很少。通常一本Go语言的书一般不超过300页,和Java、c++ 800多页的书相反,很快就能学会。
如果你学过其他OO语言,刚开始用Go,会觉得很不适应,会觉得很多想要的功能都没有,会有继承如何实现、有没有静态方法、指针、引用等一系列不习惯的问题。
对于那些有经验,有太多语言学习的开发者来说,学习围棋会是一种解脱感,他们发现自己花了太多时间学习语言,而不是真正的东西。之前研究爬虫框架的时候,你会发现colly和scrapy在学习成本上的区别。
以上最后一点是我最真实的感受。刚学了半年围棋语言,现在也算是围棋语言布道者了,每周坚持一篇与围棋相关的文章。
Go语言最大的一个特点就是简单易学,非常适合入门。
像现在很流行的Docker和k8s,这些基于云的基础软件都是Go开发的。此外,头条、滴滴、猎豹,腾讯、蚂蚁金服等多家头部公司的部分业务线,都已经转向Go或者部分业务线转向Go。
建议初学者先理解概念,再多练习。推荐阅读《深入学习围棋语言》。
Golang是Google开发的,开发者社区很小。语言需要长期的积累来推动整个生态的改善,golang在改善。Golang的速度快赶上C了,C适合并行操作,在区块链领域应用广泛。属于传统编译型静态语言,吸收了python的简洁!前景很好,长远来看钱景也不错!
发表评论