hello云胜

技术与生活

0%

介绍

首先从go语言本身的介绍开始。
有很多可以讲的,但是我们必须从某个地方开始说,带我们一步步学习go语言
同时会讲到几个重要的库

首先,我们要知道的go是google内部一个小团队的创造。这个小团队的三个创始人是Robert griesmer(hotsopt虚拟机设计者,javascript v8引擎设计者),Ken Thompson(c语言之父,unix之父),Rob
Pike(plan9操作系统领导者)。
这几个人都是当今软件工程领域响当当的大牛。,Ken Thompson设计和实现了unix操作系统,并是Unicode设计的关键人物。
所以当这几个人坐到一起,并决定开发一门新的语言时。
第一个问题时,为什么需要一个新的语言?
要理解这个问题,首先要了解当时谷歌内部广泛使用的语言,最主要的语言是三个,第一个是Python,然后是Java,最后是C和C++。这几种语言都很棒,
但是考虑到这几种语言的设计限制和历史遗留问题,go的设计者们认为google目前需要一门新的语言。
比如,Pyhton,python很容易使用。但它是一门解释型语言。
如果使用python编写非常大型的应用,那么在google的体量下,会遇到很多挑战。
java很快,但是随着时间推移,他的类型系统越来越复杂。(这也是很多语言的问题)。他们刚推出时很简单,然后不断增加新的特性,使语言本身越来越复杂。
c和c++也很快,但是他们也有复杂的类型系统,而且编译很慢。最近类型系统的问题越来越被社区关注,但是必须承担历史遗留代码的负担。java也同样面临这个问题。这些语言必须兼容以前的代码,很多十年前编写的代码,现在还需要编译。
编译慢的问题,也是一个历史遗留问题。当初在c和c++设计之时,计算机的内存很小,和现在不可同日而语。所以c和c++的编译被设计为使用尽量小的内存,编译速度可以慢一点。
以上三种语言设计的时代,多线程应用非常少。绝大多数应用都是单线程运行。所以对并发的支持只是一种锦上添花。
所以google目前的高并发环境下,继续使用这三种语言遇到了越来越多的问题。

所以,说回go。go带来了什么呢?

  1. go是强类型的静态类型语言,这和java,c++是一样的。那强类型是什么意思?强类型就是变量不能改变其类型。当你定义int类型的变量a,那么a总是只能持有一个整数。你不能给a赋值一个Boolean,或者赋值一个string。
    静态类型表示所有的变量必须在编译期就被定义。
    go提供了特性允许你绕过这个强类型系统。但是99%的情况下,你都应该处在go的强类型-静态类型系统下,你会从中收益的。如果你是一个java开发者,你可能会有点担心,因为强静态类型语言通常语法上会有点冗长。等稍后学习到go语法,你会发现,go语言做了很多努力让编译器来自动分析当你定义变量时你究竟是要做什么。比如你不需要每次都写变量的类型,等等类似的事。
    2.go拥有一个出色的社区。go是一门出色的语言,但是并不能保证一定会成功。现在市面上有很多语言,让一个新的开发者完全扑到一门语言上是很困难的。因此,围绕go语言建立了坚固的社区,不断推动go语言向前发展,让新的开发者更容易的入门go。
    3.关键特性
  • 第一,也是最重要的就是简单。简单为什么会成为一种特性?随着你慢慢学习和熟悉go语言,你可能发现go没有其他语言的某种特性,你会问自己,为什么go没有这个特性,为什么我们不需要这个特性?这些问题的答案都是要保持简单。go认为简单性是非常重要的。这就导致了必须舍弃一些看起来很有用的特性,如果增加这些特性会显著的增加复杂性,那我们就不要增加这个特性
  • 第二,go极其关注编译效率。在现代开发环境下,我们要求快速开发,快速构建,快速测试,使开发者能够迅速得到反馈。如果你花了45分钟在编译上,那么这个环就被打破了。所以go针对性的提高编译效率,降低编译时长。尽管让我们放弃全量编译。
  • 垃圾收集。go是有垃圾收集的,意味着你不需要自己去管理内存。你也可以自己去管理内存。但大体上来说,还是go运行时在管理内存。这也是简单性的一个体现。有一个说法是,带垃圾收集的语言在处理某些场景时会有问题。比如股票市场的实时交易系统,当出现垃圾收集时会有问题,但是,对于开发者而言,不需要管理内存带来的优势显然更大。当然这不是说垃圾回收带来的延时问题不被重视了,如果你仔细看go的版本历史,你会发现go花了很多力气去降低垃圾回收期间暂停的时间,以至于现在你基本感觉不到垃圾回收暂停的时间。
  • 原生的并发支持。为了体现对并发编程的关注,go直接将并发原语内置到语言中。我们在以后的视频会学习这部分知识。我们不需要引入其他任何包,只是用语言自身就可以进行并发编程。
  • go编译成一个单独的库。这意味着,当你编译你的go应用,所有和这个应用相关的依赖都会被打进这个包里。go的运行时会打进来,你依赖的库,会编译后会打进来,所以你不需要担心会去外部环境找外部依赖库或者dll文件。这样一来,应用的版本管理变得简单。因为你只有一个二进制文件,你分发这个文件,运行这个文件。所有你需要的依赖全部在这里。注意,我这里说的依赖指的是go的依赖。如果你构建的是一个web应用。有html资源,css资源,这些资源也必须打进这个二进制文件里。