给 Python 开发者的 Go 语言入门指南
peachchen
8年前
<h3>0. 关于</h3> <p>之前 <a href="/misc/goto?guid=4959673949358183791" rel="nofollow,noindex">学习过 Go 一段时间</a> ,用 <a href="/misc/goto?guid=4959673949451307726" rel="nofollow,noindex">Vim 做为 IDE</a> ,也尝试过几次 <a href="/misc/goto?guid=4959673949536954357" rel="nofollow,noindex">用 Go 做服务器后端</a> ,后来因为没有再写网站的需求就放下了一段时间。现在回忆一下用 Go 的体验,与 Python 相比可能有下面几点优势:</p> <ol> <li>高性能,高性能,高性能;</li> <li>低内存,低内存,低内存;</li> <li>异步;</li> </ol> <p>缺点有:</p> <ol> <li>库太少(相比于 Python);</li> <li>内置数据结构及操作太简陋;</li> <li>第三方库依赖、安装、管理麻烦(墙也占了一部分原因);</li> </ol> <p>最近来看 Go 的发展还是相当不错的,至少在服务器与后端方面的优势(高能低耗二进制包)还是非常吸引人的。新电脑上还没有配置过 Go 语言环境,刚好这次重新安装、配置一次,并从基础语法上与 Python 进行对比,方便有兴趣的 Python 开发者可以快速尝试一下 Go 语言,顺便作为笔记。</p> <p>本文主要包括:</p> <ol> <li>Go 安装与配置</li> <li>Atom as IDE</li> <li>Go VS Python</li> </ol> <h3>1. Go 安装与配置</h3> <p>所有安装、配置的步骤都在 <a href="/misc/goto?guid=4959667237945296763" rel="nofollow,noindex">官网(需KX上网)</a> ( <a href="/misc/goto?guid=4959673949650244334" rel="nofollow,noindex">国内文档镜像</a> , <a href="/misc/goto?guid=4959673949735851603" rel="nofollow,noindex">国内安装包镜像</a> )有清楚的说明,Mac OS X 已经有了 pkg 版本,可以直接双击安装。Go 语言有几个非常重要的环境变量需要搞清楚并设定好:</p> <p>GOROOT :</p> <p>Go 的安装目录。这个目录是 Go 寻找内置库的地方,如果是 Mac OS X 安装包默认位置为 /usr/local/go ,如果是从源码手动安装,若不是安装到 /usr/local/go 则将其设定为安装目录(若是默认位置无需设定):</p> <pre> # add to ~/.bashrc or ~/.zshrc export GOROOT=/path/to/where/go/installed </pre> <p>GOPATH :</p> <p>你的工作目录。这个目录用于存放从网上下载的第三方库以及你自己创建的项目。与 Python 不同的是,Go 的目标并不在于创建可以随处执行的脚本,而是以项目为单位。可以任意选择一个目录作为你的 Go 工作目录:</p> <pre> # add to ~/.bashrc or ~/.zshrc export GOPATH=/Users/rainy/Projects/go </pre> <p>除了这两个必备的环境变量之外,还可以设定一下系统信息:</p> <pre> export GOARCH=amd64 export GOOS=darwin export GOBIN=/usr/local/go/bin </pre> <p>最后一个 GOBIN 是指执行 go get some-package 的时候将生成的二进制命令保存到的目录,如果不设定默认为 $GOPATH/bin ,最好将这一目录添加到系统路径中(若设定为 /usr/local/go/bin 还需要注意权限问题):</p> <pre> # add to ~/.bashrc or ~/.zshrc export PATH=$PATH:$GOBIN </pre> <p>现在就算是安装配置完成了,执行:</p> <pre> go version # go version go1.6.2 darwin/amd64 </pre> <p>再试试安装一个命令行工具:</p> <pre> go get -u github.com/astaxie/bat </pre> <p>bat 工具将会被安装到 $GOBIN 下,这时我们回到工作目录下,会发现目录结构变为:</p> <pre> cd $GOPATH && tree -L 1 # . # ├── bin # ├── pkg # └── src </pre> <p>其中 src 下面保存的是各种第三方库以及自己项目的源文件, bin 则是 go get 或 go install 生成的二进制执行文件, pkg 是平台相关的包。接下来将 Atom 配置成 Go 专用 IDE!</p> <h3>2. Atom as Go IDE</h3> <p>之前配置过 <a href="/misc/goto?guid=4959673949451307726" rel="nofollow,noindex">Vim</a> ,但现在大部分情况都是用 Atom,而且 Atom 的插件管理更方便,所以就用 Atom 作为 IDE!</p> <p>首先要安装的插件是 <a href="/misc/goto?guid=4959673949840238400" rel="nofollow,noindex"> go-plus </a> ,但结果发现它有一堆的依赖插件需要安装,并且这些插件依赖一些 Go 的工具,不过现在 Atom 已经可以自动安装依赖插件了,不需要一个一个手动安装:</p> <p><img src="https://simg.open-open.com/show/bfd71aac7ca899e479a6e73f54b75c79.png"></p> <p>这些插件有可能会需要一些 Go 工具的支持,例如 golint 、 goimport 、 gocode 等,这里就体现出我上面提到的缺点之一了,如果是托管在 github 上的库还算好点,但如果 golang.org 或者 code.google.com 就需要KX上网了,之前也是被这些第三方库搞得焦头烂额,体验非常差。</p> <p>经过漫长的等待, go-plus 的依赖都安装完了,然后安装 Go 工具:</p> <pre> go get -u github.com/nsf/gocode go get -u github.com/golang/lint # 对于 golang.org/x/ 下面的包建议去 GitHub 镜像仓库手动 Clone 项目,然后本地执行 go install cd $GOPATH mkdir -p golang.org/x cd golang.org/x git clone https://github.com/golang/tools.git go install golang.org/x/tools/cmd/goimports </pre> <p>先不着急用 Atom 创建 Go 文件,先来看看此时的工作目录:</p> <pre> cd $GOPATH tree -L 2 # . # ├── bin # ├── pkg # │ └── darwin_amd64 # └── src # ├── github.com # ├── golang.org # ├── gopkg.in # └── honnef.co </pre> <p>Go 的第三方库存放目录是以托管网站开头的( import 的时候也是这样),自己创建的项目也应该遵循这个规范!(注意到我这里的 bin 目录下没有任何可执行文件,因为我把它们移动到系统路径下了)。</p> <p>接下来创建一个新项目:</p> <pre> cd $GOPATH mkdir src/github.com/rainyear/learn atom src/github.com/rainyear/learn </pre> <p><img src="https://simg.open-open.com/show/0773603cf39e23359d93964bff6670f2.gif"></p> <p>如果你还觉得 Python 的缩进是强迫症的话,那么真正的强迫症来了!Go 提供了 gofmt 和 goimports 工具,帮助你强行把代码整理干净,包括缩进、花括号、 import ,只要在 Atom 中保存一下,代码就会被重新整理一遍,这才是强迫症患者的福音!不过 Google 也将这一福利推广至 Python,推出了 <a href="/misc/goto?guid=4958976761916412877" rel="nofollow,noindex">Python 格式化工具: yapf</a> 。</p> <p>上图中是通过 Atom 的 Builder 插件执行 go run main.go 运行的,如果整个项目完成之后,可以通过 go install 打包生成二进制文件(甚至可以生成跨平台的二进制包,直接部署到线上!):</p> <pre> cd $GOPATH/src/github.com/rainyear/learn go install # 二进制包将会打包至 $GOBIN 或者 $GOPATH/bin cd $GOPATH ls bin # learn ./bin/learn # Hello world! </pre> <h3>3. Go VS Python</h3> <p>最后来比较一下 Go 与 Python 的一些基本语法,其中 Go 语言的例子来自 <a href="/misc/goto?guid=4959673949943246914" rel="nofollow,noindex">A Tour of Go</a> , <a href="/misc/goto?guid=4959673950028026493" rel="nofollow,noindex">源文件</a> :</p> <p><img src="https://simg.open-open.com/show/6363c8e0b74b8058004d6b42e369b63e.png"> <img src="https://simg.open-open.com/show/b7b9e24ebd0769f26b8c9120625b563a.png"> <img src="https://simg.open-open.com/show/fd76c70eba0367d1c24356ac9353062d.png"> <img src="https://simg.open-open.com/show/30e9c12e2ecd0a84706557633306d835.png"> <img src="https://simg.open-open.com/show/ae33de62968db2b55a4e9536782bc36b.png"> <img src="https://simg.open-open.com/show/ee7cc0204615fc59cb41cc98be7320c9.png"> <img src="https://simg.open-open.com/show/e8ed2be1043ec826cb1918ea2d2a372e.png"> <img src="https://simg.open-open.com/show/29c7277287058cda4b8b0bbdb253b320.png"></p> <p> </p> <p>来自: <a href="/misc/goto?guid=4959673950113335299" rel="nofollow">http://blog.rainy.im/2016/05/30/golang-101-for-pythoners/</a></p> <p> </p>