GO_02:GO语言开篇

Go的发展史

  Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。

  Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。

当前行业背景

  计算机一直在演化,但是编程语言并没有以同样的速度演化。现在的手机,内置的CPU核数可能都多于我们使用的第一台电脑。高性能服务器拥有64核、128核,甚至更多核。但是我们依旧在使用为单核设计的技术在编程。

  编程的技术同样在演化。大部分程序不再由单个开发者来完成,而是由处于不同时区、不同时间段工作的一组人来完成。大项目被分解为小项目,指派给不同的程序员,程序员开发完成后,再以可以在各个应用程序中交叉使用的库或者包的形式,提交给整个团队。

  如今的程序员和公司比以往更加信任开源软件的力量。Go语言是一种让代码分享更容易的编程语言。Go 语言自带一些工具,让使用别人写的包更容易,并且 Go 语言也让分享自己写的包更容易。

GO解决现代编程难题

  Go语言开发团队花了很长时间来解决当今软件开发人员面对的问题。开发人员在为项目选择语言时,不得不在快速开发和性能之间做出选择。C和C++这类语言提供了很快的执行速度,而Ruby、PHP和Python这类语言则擅长快速开发。Go语言在这两者间架起了桥梁,不仅提供了高性能的语言,同时也让开发更快速。

  作为一门语言,Go不仅定义了能做什么,还定义了不能做什么。Go语言的语法简洁到只有几个关键字,便于记忆。Go语言的编译器速度非常快,有时甚至会让人感觉不到在编译。所以,Go开发者能显著减少等待项目构建的时间。因为Go语言内置并发机制,所以不用被迫使用特定的线程库,就能让软件扩展,使用更多的资源。Go语言的类型系统简单且高效,不需要为面向对象开发付出额外的心智,让开发者能专注于代码复用。Go语言还自带垃圾回收器,不需要用户自己管理内存。让我们快速浏览一下这些关键特性(当然,Go的垃圾回收机制还是没有java语言中的那么强大,虽然开发人员扬言要赶超JVM垃圾回收机制,那就让我们拭目以待吧。截止到我发这篇博客的时间:2017-03-16 22:13:42 版本已经升级到了1.8

资源充分利用

  作为程序员,要开发出能充分利用硬件资源的应用程序是一件很难的事情。现代计算机都拥有多个核,但是大部分编程语言都没有有效的工具让程序可以轻易利用这些资源。这些语言需要写大量的线程同步代码来利用多个核,很容易导致错误。

  Go语言对并发的支持是这门语言最重要的特性之一。goroutine很像线程,但是它占用的内存远少于线程,使用它需要的代码更少。通道(channel)是一种内置的数据结构,可以让用户在不同的goroutine之间同步发送具有类型的消息。这让编程模型更倾向于在goroutine之间发送消息,而不是让多个goroutine争夺同一个数据的使用权。

Go 语言用途

  Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

  对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

第一个Go 程序

  接下来我们来编写所有初学程序必会的打印程序,打印:Hello World!。 hello.go(Go 语言源文件的扩展是 .go),代码如下:

package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
} 

以上代码运行结果如下:

go run hello.go
Hello, World!

  再演示一个其他语言常用到的打印语句:

package main

import std "fmt"

func main() {
    std.Println("go" + "lang")

    std.Println("1+1 =", 1+1)
    std.Println("7.0/3.0 =", 7.0/3.0)

    std.Println(true && false)
    std.Println(true || false)
    std.Println(!true)
}

以上代码运行结果如下:

golang
1+1 = 2
7.0/3.0 = 2.3333333333333335
false
true
false

GO 底层默认执行函数

 main函数 和 init函数

  Go里面有两个保留的函数:init函数(能够应用于所有的package) 和 main函数(只能应用于package main)。 这两个函数在定义时不能有任何的参数和返回值。虽然一个package里面可以写任意多个init函数,但这无论是对于可读性还是以后的可维护性来说,我们都强烈建议用户在一个package中每个文件只写一个init函数。

  Go程序会自动调用init()和main(),所以你不需要在任何地方调用这两个函数。每个package中的init函数都是 可选的,但package main就必须包含一个main函数。

  程序的初始化和执行都起始于main包。如果main包还导入了其它的包,那么就会在编译时将它们依次导入。有时一 个包会被多个包同时导入,那么它只会被导入一次(例如很多包可能都会用到fmt包,但它只会被导入一次,因为没 有必要导入多次)。当一个包被导入时,如果该包还导入了其它的包,那么会先将其它包导入进来,然后再对这些包 中的包级常量和变量进行初始化,接着执行init函数(如果有的话),依次类推。等所有被导入的包都加载完毕 了,就会开始对main包中的包级常量和变量进行初始化,然后执行main包中的init函数(如果存在的话),最后执 行main函数。下图详细地解释了整个执行过程:

  

Go文档查看

  在深入学习 Go 语言的时候,我们最好还是先将对应的文档搞到手,这就是所谓的:工欲善其事,必先利其器。

  对于所有的语言来说,没有帮助文档简直是程序猿的灾难,而 Go 语言默认采用了和 Python 相类似的文档查看,即在终端中想要查看命令的使用通过命令查看,例如我要查看打印包下的方法即用命令:

    godoc fmt

  这样打印出来的内容会很多而且不易查看,这不是我们想要的效果,而想要查看官方文档在国内又必须得通过FQ才可以访问得道,很是头疼啊,我们可以使用 Go 提供的命令来生成和官网一模一样的文档,运行一下命令:

    godoc -http :8080

   运行完命令之后终端命令就卡在当前位置,此时该终端相当于一个 WEB 服务器,是不能关闭的。我们只需要打开相应的浏览器输入地址 --> http://localhost:8080 即可进入官方文档查看我们想要的内容了。

 

posted @ 2017-03-16 22:30  星火燎原智勇  阅读(362)  评论(0编辑  收藏  举报