Golang 学习笔记(一)——安装、环境

为什么学习 Go?

我目前的主要开发语言是 Java。其实在 Java7 以后,使用 Java 开始起来已经是比较顺手的,特别是现在我使用的 Java8 中引入的 Lambda 表达式,更是让其开发效率有了明显的提升。

我也了解过 Python 一段时间,不过主要用它就是做 spider 或为了替代一部分 shell 脚本。用 Python 的时候深深的被它的效率所吸引,并曾准备了解一下 Flask 或 Django 以做 Web 开发。不过后来因为别的原因还是放弃了(并行、性能、语法糖等等)。

那为什么学习 Go 呢?
首先 Go 的背景很“硬”——一帮子大牛设计者、Google 出品。其设计理念很明确,就是将动态类型语言的编程容易度和静态类型语言的安全效率结合起来。
其次已经有很多公司和项目开始 Go 进行开发了(国外如 Google、AWS、CloudFlare、CoreOS、Docker 等,国内如七牛、阿里等),跟着世界级巨人的脚步应该不至于走错方向。

在这几天简单的学习了一下 Golang 后,我对其有以下几点浅薄理解:

  • 关键词少(25个)、语法简单,有其他类 C 语言基础的,入门很快
  • 语言层面支持并发
  • 性能强劲的同时,开发效率又不差
  • 代码简洁,风格统一(再也不用为代码风格而争论了)
  • 部署简单
  • 多返回值
  • 非侵入式的 interface 设计
  • OO

当然,Go 也有缺点,毕竟相比与 C/C++、Java、Python等来讲,Go 还只是一个“新生儿”,相信它会成长起来的。

最后,可能有人又会扯到“这个语言比那个语言好”或“XXX 是最好的语言,没有之一”。
没有什么 X 语言比 Y 语言好,如果你是某种语言老手,你就是那门语言的“传道者”,下意识地会保护它。无论承认与否,你都已被困在一个隧道里,你看到的完全是局限的。《肖申克的救赎》对此有很好的注脚:

These walls are funny. First you hate ‘em, then you get used to ‘em. After long enough, you get so you depend on ‘em. That’s “institutionalized.”
这些墙很有趣。起初你痛恨它们;慢慢地,你习惯了生活在其中;最终你会发现自己不得不依赖它们。这就是体制化。

在你还没有被完全“体制化”时,为何不多学些语言,哪怕只是浅尝辄止,潜移默化中也许你的思维壁垒就松动了。不管是 Golang 、Python 或 Ruby 还是其他语言,当看到一些语法习惯与之前熟悉的 C 和 Java 不同时,的确潜意识里就会产生抵触情绪,觉得这不好,还是自己习惯的那套好。长此以往,如果不能冲破自己的心理,“坐以待毙”,被时间淘汰恐怕只是早晚的事儿。所以这里的关键——不是非要学习 Golang,而是要不断地学!

安装 Go tools

首先在官网下载对应平台的安装包。(墙内下载:http://www.golangtc.com/download

这里以 OS X 为例:
下载后直接运行 pkg 文件,一路 next,安装完成后 Go 的发行版会被安装到/usr/local/go中。

Mac 上也可以直接用 Homebrew 安装 Go
然后将/usr/local/go/bin目录添加到PATH环境变量中。

测试是否安装成功

先直接试试再说:

1
$ go

只要没报command not found: go话应该就是没啥问题的。

再来个简单的 go 程序来试试:
首先创建一个 workspace(我这里就以 gowork 命名了)

1
2
$ mkdir $HOME/gowork
$ export GOPATH=$HOME/gowork

(GOPATH这个环境变量下边还会细说)
然后在这个 workspace 下创建一个存放源码的目录:

1
$ src/codingon.com/hello

hello目录下创建一个名为hello.go的文件,内容如下:

1
2
3
4
5
6
7
package main

import "fmt"

func main() {
fmt.Printf("hello, world\n")
}

通过下边的命令编译安装并运行

1
2
$ go install codingon.com/hello
$ $GOPATH/bin/hello

也可以直接用下边的命令“解释”运行。区别是上边的会在$GOPATH下生成bin目录,而下边的不会(其实是生成了一个临时目录,在运行结束后自动删除掉了)

1
$ go run $GOPATH/src/codingon.com/hello/hello.go

如果看到打印出hello, world,就说明 Go tools 安装的没有问题。

关于 GOPATH

go 命令依赖一个很重要的环境变量:GOPATH
我们在第二步的时候已经通过以下命令设置了这个环境变量。

1
$ export GOPATH=$HOME/gowork

GOPATH 支持设置多个目录,因为平时要用go get获取一些第三方的代码,而go get默认会把这些代码下载到第一个工作区,所以我们一般会设置两个或以上的工作区目录(将自己的代码和第三方的代码分离),例如:

1
$ export GOPATH=$HOME/golang/lib:$HOME/golang/work

GOPATH 目录下约定有三个子目录:

  • src 存放源码
  • pkg 编译后生产的文件
  • bin 编译后生产的可执行文件

其中 src 目录是需要你手动新建的,pkg、bin 目录都可以在运行go buildgo install等命令时自动生成。

IDE

Go 目前还没有官方的 IDE,有一个国人开发的 LiteIDE 还不错,就是有时候不是太稳定,容易崩溃。也可以使用 IntelliJ IDEA、Eclipse 或 Sublime Text 安装对应的 GO 插件,使其支持 GO 语言。
如果只是为了学习 Go,可以使用官方的 Playground 在线运行 Go 程序。

调试:Go 用 GDB 调试。有关 GDB 的安装请看 Mac OS X 下安装 GDB

学习 Go

Go 从 1.0 到 1.5 语法感觉没什么变化,网上关于其语法的文章也很多,官网也有语法讲解和训练( https://tour.golang.org )。

以下是一些 Golang 的学习资源:

  1. Go 指南:官网链接:https://go-tour-zh.appspot.com/welcome/1(需要梯子),如果无法打开请用国内链接:http://tour.studygolang.com/
  2. 《The Way to Go》,如果看英文感觉吃力,github上无闻大牛已经做了中文译本:https://github.com/Unknwon/the-way-to-go_ZH_CN
  3. 《Go 学习笔记 第四版》雨痕写的,该电子书在 github 开源:https://github.com/qyuhen/book
  4. 《Go Web编程》,是谢大(beego的作者)写的书,github中文目录链接:https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/preface.md
  5. 《Go 编程基础》视频教程,此教程是无闻大牛讲解的,github视频链接:https://github.com/Unknwon/go-fundamental-programming