可热更新的定时器

1.2.1 hello world #

Go 语言是谷歌 2009 发布的第二款开源编程语言。
Go 语言专门针对多处理器系统应用程序的编程进行了优化,使用 Go 编译的程序可以媲美 C 或 C++代码的速度,而且更加安全、支持并行进程。

1.2.1 为什么要选择学习 Go 语言呢?与其他语言的应用相比,它有什么优点呢? #

1、学习曲线它包含了类 C 语法、GC 内置和工程工具。这一点非常重要,因为 Go 语言容易学习,所以一个普通的大学生花一个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内 Go 流行的原因之一。

2、效率 Go 拥有接近 C 的运行效率和接近 PHP 的开发效率,这就很有利的支撑了上面大家追求快速的需求。

3、出身名门、血统纯正之所以说 Go 语言出身名门,是因为我们知道 Go 语言出自 Google 公司,这个公司在业界的知名度和实力自然不用多说。Google 公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑。而且从 Go 语言的发展态势来看,Google 对它这个新的宠儿还是很看重的,Go 自然有一个良好的发展前途。我们看看 Go 语言的主要创造者,血统纯正这点就可见端倪了。

4、自由高效:组合的思想、无侵入式的接口 Go 语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持。Go 语言支持当前所有的编程范式,包括过程式编程、面向对象编程以及函数式编程。程序员们可以各取所需、自由组合、想怎么玩就怎么玩。

5、强大的标准库这包括互联网应用、系统编程和网络编程。Go 里面的标准库基本上已经是非常稳定了,特别是我这里提到的三个,网络层、系统层的库非常实用。

6、部署方便:二进制文件、Copy 部署我相信这一点是很多人选择 Go 的最大理由,因为部署太方便了,所以现在也有很多人用 Go 开发运维程序。

7、简单的并发它包含了降低心智的并发和简易的数据同步,我觉得这是 Go 最大的特色。之所以写正确的并发、容错和可扩展的程序如此之难,是因为我们用了错误的工具和错误的抽象,Go 可以说这一块做的相当简单。

8、稳定性 Go 拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么 Go 相比于其他程序会更稳定呢?这是因为 Go 提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如 go tool、gofmt、go test。

1.2.2 Go 语言适合用来做什么? #

服务器编程:以前你如果使用 C 或者 C++做的那些事情,用 Go 来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。

分布式系统:数据库代理器等。

网络编程:这一块目前应用最广,包括 Web 应用、API 应用、下载应用、内存数据库。

云平台:google 开发的 groupcache,couchbase 的部分组建云平台,目前国外很多云平台在采用 Go 开发,CloudFoundy 的部分组建,前 VMare 的技术总监自己出来搞的 apcera 云平台。

1.2.3 Go 语言成功的项目 #

nsq:bitly 开源的消息队列系统,性能非常高,目前他们每天处理数十亿条的消息
docker:基于 lxc 的一个虚拟打包工具,能够实现 PAAS 平台的组建
packer:用来生成不同平台的镜像文件,例如 VM、vbox、AWS 等,作者是 vagrant 的作者
skynet:分布式调度框架
Doozer:分布式同步工具,类似 ZooKeeper
Heka:mazila 开源的日志处理系统
cbfs:couchbase 开源的分布式文件系统
tsuru:开源的 PAAS 平台,和 SAE 实现的功能一模一样
groupcache:memcahe 作者写的用于 Google 下载系统的缓存系统
god:类似 redis 的缓存系统,但是支持分布式和扩展性
gor:网络流量抓包和重放工具

1.2.4 哪些大公司在用 go 语言? #

Google

这个不用多做介绍,作为开发 Go 语言的公司,当仁不让。Google 基于 Go 有很多优秀的项目,比如:https://github.com/kubernetes/kubernetes ,大家也可以在 Github 上 https://github.com/google/ 查看更多 Google 的 Go 开源项目。

Facebook

Facebook 也在用,为此他们还专门在 Github 上建立了一个开源组织 facebookgo,大家可以通过 https://github.com/facebookgo 访问查看 facebook 开源的项目,比如著名的是平滑升级的 grace。腾讯
腾讯作为国内的大公司,还是敢于尝试的,尤其是 Docker 容器化这一块,他们在 15 年已经做了 docker 万台规模的实践,具体可以参考 http://www.infoq.com/cn/articles/tencent-millions-scale-docker-application-practice

百度

目前所知的百度的使用是在运维这边,是百度运维的一个 BFE 项目,负责前端流量的接入。他们的负责人在 2016 年有分享,大家可以看下这个 http://www.infoq.com/cn/presentations/application-of-golang-in-baidu-frontend

阿里

阿里巴巴具体的项目不太清楚,不过听说其系统部门、CDN 等正在招 Go 方面的人。京东
京东云消息推送系统、云存储,以及京东商城等都有使用 Go 做开发。

小米

小米对 Golang 的支持,莫过于运维监控系统的开源,也就是 http://open-falcon.com/

此外,小米互娱、小米商城、小米视频、小米生态链等团队都在使用Golang。

360

360 对 Golang 的使用也不少,一个是开源的日志搜索系统 Poseidon,托管在 Github 上,https://github.com/Qihoo360/poseidon

Go语言前景:

(以上数据来源于网络)

1.2.5 第一个 go 程序 #

带着目标学东西往往是最有成效的,为什么学以及环境安装可以参考前面的文章。

let’s go go go !

package main

import "fmt"

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

这是一个最简单的 go 程序,由三个元素构成

元素一、包package是包,每个文件夹是一个包,默认包名就是文件夹名,文件夹下所有的.go文件全部都是同一个包。

main包整个项目的入口,你可以在指定任意一个文件夹当作程序的入口,然后把里面所有文件第一行改成package main,也可以把项目根目录当作main包。

PS: 每个项目默认有且只有一个main

元素二、import:这个关键字代表引入其他地方的包,可以是当前项目的,也可以是别人写的。 这里import "fmt"引入的就是 go 原生的fmt包,专门用来输出文本的。

元素三、语句

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

main 入口函数,每个项目只有一个main函数

执行以上代码输出

$ go run hello.go
Hello, World!

1.2.6 让你的项目在IDE里跑起来 #

每次新建项目,不熟悉go的项目结构,一般跑都跑不起来,每次都要重新搞一遍,好几回跑项目都会报类似File is invalid的错误

有时候报其他奇怪的错误,今天就下决心整理一下,理一理概念 GOROOT、GOPATH、src、 pkg、bin,希望以后不要再出现这样的问题了,同时给看到文章的你一些帮助。

1.2.6.1 熟悉golang项目目录结构 #

要想让你的程序跑起来,要按照这样的目录结构,正常情况下有三个目录:

|--bin
|--pkg
|--src

其中,bin存放编译后的可执行文件;pkg存放编译后的包文件;src存放项目源文件。一般,bin和pkg目录可以不创建,go命令会自动创建(爽否?),只需要创建src目录放代码即可。

我创建一个src目录,下面再创建一个叫main的项目(可以叫任何名字,我只是示例叫main),里面只有一个main.go文件。

他的内容是:

package main

import "fmt"

func main() {
	fmt.Println("hello world")
}

本节源码位置 https://github.com/golang-minibear2333/golang/blob/master/1.base/1.2-hello-world

这样一个简单的项目就创建好了,创建好只是第一步,下面让她跑起来。

1.2.6.2 让她跑起来 #

找到配置,Goland里面大多数的配置都在这里。

配置你的GOROOT,配置成你安装的go路径,Goland会自动识别,这就是GOROOT的作用,和JAVA_HOME的作用差不多。

配置GOPATH,你的项目放在src下面不是随随便便就放的,得让go知道你这些个项目基于哪个位置。

细心的人注意到,这里有一个Project GOPATH,还有一个Global GOPATH,把你的项目配置在Project GOPATH里,每个项目都不一样,创建另一个项目时这个路径要配置成新项目的。

Global GOPATH可以弄一个公共项目,以后就把第三方的包直接装到这里,就可以自动在你的项目里引用了。

调出ToolBar,开始配置运行文件

ToolBarAdd Configuration

创建一个go build,可以看到有一个go remote的选项,它是用来调试远程服务器上的代码的,有兴趣关注我,我后续更新。

注意这三个位置,

File,运行文件就选main函数所在在文件main.go,输出文件夹就在和src同级目录的bin文件夹(自动创建),Working directory目录就是刚刚设置GOPATH的目录(自动)

注意,如果你多次打开目录选择,框框里的目录不会被替换掉,而是追加,导致运行的时候报错,除非你想一次性编译多个项目。

例如这样:

/Users/pzqu/Documents/code/go/what_go/src/main/main.go|/Users/pzqu/Documents/code/go/what_go/src/main/main.go

点击OK保存,之后,在ToolBar上点击运行,旁边那个符号是debug

成功运行!自动创建了bin目录

如果你想改输出的二进制文件名,可以在这里添加参数-o bin/main

1.2.7 如何在一个项目中使用其他项目? #

1.2.7.1 引用自己的项目中的其他模块包 #

写一个新函数func Add(a, b int) int,放在src下面main项目,calc文件夹,add.go文件里

|____src
| |____main
| | |____calc
| | | |____add.go
| | |____main.go

代码如下

package calc

func Add(a, b int) int {
	return  a + b
}

main函数中调用他

输出结果:

几个点需要注意:

  1. add.go中的Add函数名首字母必须大写, 比如Add, Addxxx.只有大写的才是Public权限,外面的包才能访问,否则只能自己文件夹下代码才能访问

  2. add.go的改名为addyyy.go也可以,查找add包的时候,并不会根据add.go这个文件名来查找。而是根据文件夹名来查找,一个文件夹下的所有文件都属于同一个包。所以函数变量自然不能重复。

  3. main中调用add.Add(1,2)时,add是包, 必须跟add.go中的package处的包名一致,否则报错。

  4. import后, 怎么去查找对应的包呢? 思考一下, 很简单,无非就是GOROOT和GOPATH. 也应该明白了, src这个目录名可不是能随便取的。

1.2.7.2 引用第三方项目 #

自己写的其他项目引入,比如我这有一个叫common的公共包,你的公司有可能把很多go包下载下来,做一个公共仓库,方便公司内网隔离。

代码很简单

package dance

import "fmt"

func WhoDance() {
	fmt.Println("you")
}

main里面调用

package main

import "common/dance"

func main() {
	dance.WhoDance()
}

输出

you

Process finished with exit code 0

还有一个相当好用的引用第三方项目的工具,vendor关注我的博客,我们后续再见。

1.2.8 小结 #

通过这一节,你已经了解到了go语言的历史和前景,并了解到怎么在IDE里跑起来go项目。这是一切的开始,算是进入了go语言的大门,在接下来的日子希望我们可以愉快的走下去。

1.2.9 参考 #

小议并实战go包——顺便说说go中的GOROOT,GOPATH和src,pkg,bin



本图书由小熊©2021 版权所有,所有文章采用知识署名-非商业性使用-禁止演绎 4.0 国际进行许可。