选择Go语言
Go语言是在2009年推出,2012年开始在生产环境使用。自此以后,Go语言拥有全球开发者的热爱,特别在中国。据统计,GitHub已经有超过86600的Go语言开发项目,尽管它们仅仅是开源项目。与此同时,很多大的企业已经开始使用Go语言,如:IBM使用go语言构建网络安全库,。许多web大规模的公司采用go语言,如:Facebook和Amazon。Google公司不仅提供Go运行时,并且将Go语言作为Google App Engine平台服务的一部分、AWS也提供支持Go语言。同时,一些容器支持软件已经使用go语言开发,如:Docker公司使用Go语言构建Docker容器引擎和容器编排工具swarm,还有,容器编排管理工具kubernetes。
在2015年StackOverflow的调查表明,19%DevOps工程师将计划使用Go语言作为系统管理开发语言,11%web后端研发工程师将使用go语言做web开发。并且总共8%的开发工程师也计划将使用go语言。
“极简抽象艺术家”-- Go语言之美
为什么如此多的公司选择Go语言?为什么Docker虚拟化技术没有选择更传统的C语言?为什么我们没有选择Java/Spring Cloud做微服务框架开发语言?为什么这是一个明智的选择?
Go语言是由一群”老炮儿”创建,他们是Robert Griesemer,工作在V8 JavaScript引擎和Google文件系统;RobPike,工作在Unix和UTF-8字符编码格式;Ken Thompson,他是Unix和C联合创始人,2007年,他们都工作在Google,他们开始“吐槽”已有的编程语言无法满足他们系统编程的需求,于是他们开始创建Go语言。
Go语言可以在分布式系统实现快速开发。使用Go语言,开发人员和系统管理员可以快速构建云计算环境的应用程序和系统工具,而不必担心太多的问题,如依赖管理或并发编程。
Go语言有一种极简抽象艺术家的感觉,总结如下特征:
·Go属于C系Go语言和C++、Java和C#一样属于C系,Go支持快速构建、高效执行、易于开发。
·强类型Go语言是强类型语言,隐式的类型转换是不被允许的,记住一条原则:让所有的东西都是显式的。
·简单而强大的语法Go语言通过减少关键字的数量(25个)来简化编码过程中的混乱和复杂度。干净、整齐和简洁的语法也能够提高程序的编译速度,因为这些关键字在编译过程中少到甚至不需要符号表来协助解析。
·具有垃圾回收由于内存问题(通常称为内存泄漏)长期以来一直伴随着C++的开发者们,Go语言的设计者们认为内存管理不应该是开发人员所需要考虑的问题。因此尽管Go语言像其它静态语言一样执行本地代码,并实现了高效快速的垃圾回收(使用了一个简单的标记-清除算法)。
·内嵌Unicode支持Go语言支持Unicode编码
·并发支持Go语言对于网络通信、并发和并行编程的极佳支持,从而更好地利用大量的分布式和多核的计算机,这一点对于谷歌内部的使用来说就非常重要了。设计者通过goroutine这种轻量级线程的概念来实现这个目标,然后通过channel来实现各个goroutine之间的通信。他们实现了分段栈增长和goroutine在线程基础上多路复用技术的自动化。
·有指针,但不允许进行指针运算Go语言是一门类型安全和内存安全的编程语言。虽然Go语言中仍有指针的存在,但并不允许进行指针运算。
·包模式的依赖管理C语言中“头文件”的概念却导致越来越多因为依赖关系而使得构建一个大型的项目需要长达几个小时的时间。人们越来越需要一门具有严格的、简洁的依赖关系分析系统从而能够快速编译的编程语言。这正是Go语言采用包模型的根本原因,这个模型通过严格的依赖关系检查机制来加快程序构建的速度,提供了非常好的可量测性。
·不是面向对象语言在传统的面向对象语言中,使用面向对象编程技术显得非常臃肿,它们总是通过复杂的模式来构建庞大的类型层级,这违背了编程语言应该提升生产力的宗旨。函数是Go语言中的基本构件,它们的使用方法非常灵活。
·不是面向过程编程Go语言没有类和继承的概念,所以它和Java或C++看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说这是一门混合型的语言。
环境搭建(Mac OS X作为开发环境)
第一步:下载go二进制安装程序
下载地址https://golang.org/doc/install
Go官网提供FreeBSD(release 8-STABLE以上)、Linux、Mac OS X(10.8以上)和Windows(XP以上)32位(386)和64位(amd64) Go二进制文件的安装程序。如果你需要其他平台,可以通过源代码安装或使用gccgo编译器。
gccgo编译器是一款相对于go原生编译器gc而言而言更加传统的编译器,使用GCC作为后端。GCC是一款非常流行的GNU编译器,它能够构建基于众多处理器架构的应用程序。编译速度相对gc较慢,但产生的本地代码运行要稍微快一点。它同时也提供一些与C语言之间的互操作性。从Go 1版本开始,gc和gccgo在编译方面都有等价的功能。
第二步:安装Go工具
通过tar.gz安装程序安装go:
解压Go安装程序到/usr/local目录,运行安装命令需要root用户或者使用sudo。同时,修改~/.zshrc(zsh环境)添加/usr/local/go/bin到$PATH
tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
export PATH=$PATH:/usr/local/go/bin
注:默认下,go安装程序安装在/usr/local/go,如果安装到自定义目录下,需要设置环境变量GOROOT。
在Mac OS X上,你可以选择通过tar.gz安装程序安装go,也可以选择下载pkg文件安装go。
第三步:测试你的安装
安装完Go程序,可以通过写一个小程序验证安装是否成功。
首先,创建你的工作目录如:$HOME/go,(如果你使用不同的目录,需要设置环境变了GOPATH)
同时,在你的工作目录下,创建src/hello目录,创建hello.go程序,如下:
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
构建hello程序:
$cd $HOME/go/src/hello
$go build
执行hello程序
$./hello
hello, world
至此验证Go安装成功。
注:你也可以通过运行goinstall安装二进制文件到你的工作目录bin下,或使用goclean移除安装。
备注:删除或更新go安装程序
如果你想更新go安装程序,你需要删除老版本的go安装程序。你可以通过直接删除/usr/local/go目录。(Go程序默认安装目录)
使用Makefile构建工程
对于项目工程,除了构建你的代码,还包括静态分析、lint检查、安装、配置、打包等操作阶段,我们可以通过创建Makefile将项目的各个阶段通过相同的工具来管理。同时,Makefile支持跨平台使用。
.PHONY: build doc fmt lint run test vet
export GO15VENDOREXPERIMENT=1
default: build
build: fmt
go build -ldflags "-w -s" -v -o ./bin/windranger .
rel: fmt
GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -v -o ./rel/windranger .
doc:
godoc -http=:6060 -index
#http://golang.org/cmd/go/#hdr-Run_gofmt_on_package_sources
fmt:
go fmt ./...
#https://github.com/golang/lint
# go get github.com/golang/lint/golint
lint:
golint .
run: build
./bin/windranger
#http://godoc.org/code.google.com/p/go.tools/cmd/vet
vet:
go vet ./...
clean:
rm -rf bin/* rel/*
test:
go test -cover=true -v $(PACKAGES)
PACKAGES = $(shell go list ./... | grep -v ./vendor/)
下面是我自建项目的Makefile文件:
Makefile说明:
Make build构建程序
Make run运行程序
Make rm删除构建
Make test运行单元测试
.PHONY makefile中的伪目标为了避免在makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突。(注:伪目标的另一种使用场合时在make的并行和递归执行过程中。)
在Golang1.5之后,Go提供了GO15VENDOREXPERIMENT环境变量,用于将go build时的应用路径搜索调整成为 当前项目目录/vendor 目录方式。通过这种形式,我们可以实现类似于 godep 方式的项目依赖管理。
参考
1.Go语言官网
2.Go语言圣经《The Go Programming Language》
3.Go入门指南《The Way to Go》
4.HOWTHE GO PROGRAMMING LANGUAGES HELPS DOCKER AND CONTAINER ECOSYSTEM - TheNewStack