第一章Go 语言和环境搭建

选择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属于CGo语言和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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容