Go 编辑器、IDE等工具
Go 开发环境的基本要求
这里有一个你可以期待你用来开发 Go 的集成开发环境有哪些特性的列表,从而替代你使用文本编辑器写代码和命令行编译与链接程序的方式。
- 语法高亮是必不可少的功能,这也是为什么每个开发工具都提供配置文件来实现自定义配置的原因。
- 可以自动保存代码,至少在每次编译前都会保存。
- 可以显示代码所在的行数。
- 拥有较好的项目文件纵览和导航能力,可以同时编辑多个源文件并设置书签,能够匹配括号,能够跳转到某个函数或类型的定义部分。
- 完美的查找和替换功能,替换之前最好还能预览结果。
- 可以注释或取消注释选中的一行或多行代码。
- 当有编译错误时,双击错误提示可以跳转到发生错误的位置。
- 跨平台,能够在 Linux、Mac OS X 和 Windows 下工作,这样就可以专注于一个开发环境。
- 最好是免费的,不过有些开发者还是希望能够通过支付一定金额以获得更好的开发环境。
- 最好是开源的。
- 能够通过插件架构来轻易扩展和替换某个功能。
- 尽管集成开发环境本身就是非常复杂的,但一定要让人感觉操作方便。
- 能够通过代码模版来简化编码过程从而提升编码速度。
- 使用 Go 项目的概念来浏览和管理项目中的文件,同时还要拥有构建系统的概念,这样才能更加方便的构建、清理或运行我们建立的程序或项目。构建出的程序需要能够通过命令行或 IDE 内部的控制台运行。
- 拥有断点、检查变量值、单步执行、逐过程执行标识库中代码的能力。
- 能够方便的存取最近使用过的文件或项目。
- 拥有对包、类型、变量、函数和方法的智能代码补全的功能。
- 能够对项目或包中的代码建立抽象语法树视图(AST-view)。
- 内置 Go 的相关工具。
- 能够方便完整地查阅 Go 文档。
- 能够方便地在不同的 Go 环境之间切换。
- 能够导出不同格式的代码文件,如:PDF,HTML 或格式化后的代码。
- 针对一些特定的项目有项目模板,如:Web 应用,App Engine 项目,从而能够更快地开始开发工作。
- 具备代码重构的能力。
- 集成像 hg 或 git 这样的版本控制工具。
- 集成 Google App Engine 开发及调试的功能
编辑器和集成开发环境
这些编辑器包含了代码高亮和其它与 Go 有关的一些使用工具:Emacs、Vim、Xcode 6、KD Kate、TextWrangler、BBEdit、McEdit、TextMate、TextPad、JEdit、SciTE、Nano、Notepad++、Geany、SlickEdit、IntelliJ IDEA 和 Sublime Text 2。
调试器
应用程序的开发过程中调试是必不可少的一个环节,因此有一个好的调试器是非常重要的,可惜的是,Go 在这方面的发展还不是很完善。目前可用的调试器是 gdb,最新版均已内置在集成开发环境 LiteIDE 和 GoClipse 中,但是该调试器的调试方式并不灵活且操作难度较大。
如果你不想使用调试器,你可以按照下面的一些有用的方法来达到基本调试的目的:
- 在合适的位置使用打印语句输出相关变量的值(
print
/println
和fmt.Print
/fmt.Println
/fmt.Printf
)。 - 在
fmt.Printf
中使用下面的说明符来打印有关变量的相关信息:%+v
打印包括字段在内的实例的完整信息%#v
打印包括字段和限定类型名称在内的实例的完整信息%T
打印某个类型的完整说明
- 使用 panic 语句(第 13.2 节)来获取栈跟踪信息(直到 panic 时所有被调用函数的列表)。
- 使用关键字 defer 来跟踪代码执行过程(第 6.4 节)。
构建并运行 Go 程序
在大多数 IDE 中,每次构建程序之前都会自动调用源码格式化工具 go fmt
并保存格式化后的源文件。如果构建成功则不会输出任何信息,而当发生编译时错误时,则会指明源码中具体第几行出现了什么错误,如:a declared and not used
。一般情况下,你可以双击 IDE 中的错误信息直接跳转到发生错误的那一行。
如果程序执行一切顺利并成功退出后,将会在控制台输出 Program exited with code 0
。
格式化代码
Go 开发团队不想要 Go 语言像许多其它语言那样总是在为代码风格而引发无休止的争论,浪费大量宝贵的开发时间,因此他们制作了一个工具:go fmt
(gofmt
)。这个工具可以将你的源代码格式化成符合官方统一标准的风格,属于语法风格层面上的小型重构。遵循统一的代码风格是 Go 开发中无可撼动的铁律,因此你必须在编译或提交版本管理系统之前使用 gofmt
来格式化你的代码。
尽管这种做法也存在一些争论,但使用 gofmt
后你不再需要自成一套代码风格而是和所有人使用相同的规则。这不仅增强了代码的可读性,而且在接手外部 Go 项目时,可以更快地了解其代码的含义。此外,大多数开发工具也都内置了这一功能。
在命令行输入 gofmt –w program.go
会格式化该源文件的代码然后将格式化后的代码覆盖原始内容(如果不加参数 -w
则只会打印格式化后的结果而不重写文件);gofmt -w *.go
会格式化并重写所有 Go 源文件;gofmt map1
会格式化并重写 map1 目录及其子目录下的所有 Go 源文件。
gofmt
也可以通过在参数 -r
后面加入用双引号括起来的替换规则实现代码的简单重构,规则的格式:<原始内容> -> <替换内容>
。
1 | gofmt -r '(a) -> a' –w *.go |
上面的代码会将源文件中没有意义的括号去掉。
1 | gofmt -r 'a[n:len(a)] -> a[n:]' –w *.go |
上面的代码会将源文件中多余的 len(a)
去掉。( 译者注:了解切片(slice)之后就明白这为什么是多余的了 )
1 | gofmt –r 'A.Func1(a,b) -> A.Func2(b,a)' –w *.goCopy |
上面的代码会将源文件中符合条件的函数的参数调换位置。
如果想要了解有关 gofmt
的更多信息,请访问该页面:golang.org/cmd/gofmt/。
生成代码文档
go doc
工具会从 Go 程序和包文件中提取顶级声明的首行注释以及每个对象的相关注释,并生成相关文档。
它也可以作为一个提供在线文档浏览的 web 服务器,golang.org 就是通过这种形式实现的。
一般用法
go doc package
获取包的文档注释,例如:go doc fmt
会显示使用godoc
生成的fmt
包的文档注释。go doc package/subpackage
获取子包的文档注释,例如:go doc container/list
。go doc package function
获取某个函数在某个包中的文档注释,例如:go doc fmt Printf
会显示有关fmt.Printf()
的使用说明。
这个工具只能获取在 Go 安装目录下 ../go/src
中的注释内容。此外,它还可以作为一个本地文档浏览 web 服务器。在命令行输入 godoc -http=:6060
,然后使用浏览器打开 localhost:6060 后,你就可以看到本地文档浏览服务器提供的页面。
其它工具
Go 自带的工具集主要使用脚本和 Go 语言自身编写的,目前版本的 Go 实现了以下三个工具:
go install
是安装 Go 包的工具,类似 Ruby 中的 rubygems。主要用于安装非标准库的包文件,将源代码编译成对象文件。go fix
用于将你的 Go 代码从旧的发行版迁移到最新的发行版,它主要负责简单的、重复的、枯燥无味的修改工作,如果像 API 等复杂的函数修改,工具则会给出文件名和代码行数的提示以便让开发人员快速定位并升级代码。Go 开发团队一般也使用这个工具升级 Go 内置工具以及 谷歌内部项目的代码。go fix
之所以能够正常工作是因为 Go 在标准库就提供生成抽象语法树和通过抽象语法树对代码进行还原的功能。该工具会尝试更新当前目录下的所有 Go 源文件,并在完成代码更新后在控制台输出相关的文件名称。go test
是一个轻量级的单元测试框架(第 13 章)。