# 1.4 Go开发工具 本节我将介绍几个开发工具,它们都具有自动化补全,自动化 fmt 和检查等功能。因为它们都是跨平台的,所以安装步骤之类的都是通用的。 ## Visual Studio Code Vscode 是微软基于 Electron 和 Web 技术构建的开源编辑器, 是一款非常强大的编辑器。 而且目前 vscode-go 已升级为 Go 官方维护的工具, 也是当前免费开源的首选开发工具. 开源地址: https://github.com/Microsoft/vscode 1、安装Visual Studio Code 最新版 官方网站:https://code.visualstudio.com 下载 Visual Studio Code 最新版,安装过程略。 2、安装 Go 插件 点击右边的 Extensions/扩展 图标 搜索 `Go` 插件 在插件列表中,选择 Go,进行安装,安装之后,系统会提示重启 Visual Studio Code。 写一个 Hello World ,然后运行: hello.go ```Go package main import "fmt" func main() { fmt.Printf("Hello word") } ``` 保存的时候, vscode 右下角会提示,需要安装依赖包, 点击 Install All ( 建议提前设好代理, 参考 Go Module 章节 ) 另外建议使用 golint 或者 golangci-lint 等工具, 可以写出更优雅的代码; 也可以把自动保存功能开启, 开启方法为:选择菜单 File,点击 Auto save。 VSCode 代码设置可用于 Go 扩展。这些都可以在用户的喜好来设置或工作区设置(.vscode/settings.json)。 VSCode 还有一些高级配置, 打开首选项-用户设置, 一般可以通过图形界面设置 也可以通过 settings.json 进行更多高级配置: ```Go "go.buildOnSave": "package", // 'workspace', 'package', or 'off'. "go.lintOnSave": "workspace", // 'workspace', 'package', or 'off'. "go.vetOnSave": "workspace", // 'workspace', 'package', or 'off'. "go.buildFlags": [], "go.lintFlags": [], "go.vetFlags": [], "go.coverOnSave": false, "go.useCodeSnippetsOnFunctionSuggest": false, "go.formatOnSave": true, // "go.formatTool": "goimports", // goreturns "go.lintTool": "golangci-lint", "go.useLanguageServer": true, // "go.goroot": "", // 你的 Goroot, 可选配置 "go.gopath": "", // 你的 Gopath, go1.12 之后改用 go-mod, 可选配置 ``` vscode 还有一项很强大的功能就是断点调试,结合 [delve](https://github.com/derekparker/delve) 可以很好的进行 Go 代码调试 ```Go go get -v -u github.com/peterh/liner github.com/derekparker/delve/cmd/dlv brew install go-delve/delve/delve (mac可选) ``` 如果有问题再来一遍: ```Go go get -v -u github.com/peterh/liner github.com/derekparker/delve/cmd/dlv ``` 注意:修改"dlv-cert"证书, 选择"显示简介"->"信任"->"代码签名" 修改为: 始终信任 打开首选项-工作区设置,配置launch.json: ```Go { "version": "0.2.0", "configurations": [ { "name": "main.go", "type": "go", "request": "launch", "mode": "debug", "remotePath": "", "port": 2345, "host": "127.0.0.1", "program": "${workspaceRoot}", // 工作空间路径 "env": {}, "args": [], "showLog": true } ] } ``` ## GoLand GoLand 是 JetBrains 公司推出的 Go 语言集成开发环境,是 Idea Go 插件的强化版。GoLand 同样基于 IntelliJ 平台开发,支持 JetBrains 的插件体系。 经过几年不断迭代更新, GoLand 目前已经是 Go 开发工具中最成熟的 IDE 之一, 而且配置相当简单. 下载地址: https://www.jetbrains.com/go/ ## Sublime Text 这里将介绍Sublime Text 3(以下简称Sublime)+ GoSublime + gocode的组合,那么为什么选择这个组合呢? - 自动化提示代码,如下图所示 ![](images/1.4.sublime1.png?raw=true) 图1.5 sublime自动化提示界面 - 保存的时候自动格式化代码,让您编写的代码更加美观,符合Go的标准。 - 支持项目管理 ![](images/1.4.sublime2.png?raw=true) 图1.6 sublime项目管理界面 - 支持语法高亮 - Sublime Text 3可免费使用,只是保存次数达到一定数量之后就会提示是否购买,点击取消继续用,和正式注册版本没有任何区别。 接下来就开始讲如何安装,下载 [Sublime](http://www.sublimetext.com/) 根据自己相应的系统下载相应的版本,然后打开Sublime,对于不熟悉Sublime的同学可以先看一下这篇文章[Sublime Text 全程指南](http://blog.jobbole.com/88648/)或者[sublime text3入门教程](http://blog.csdn.net/sam976/article/details/52076271) 1. 打开之后安装 Package Control:Ctrl+` 打开命令行,执行如下代码: 适用于 Sublime Text 3: ```Go import urllib.request,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib.request.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()) ``` 适用于 Sublime Text 2: ```Go import urllib2,os;pf='Package Control.sublime-package';ipp=sublime.installed_packages_path();os.makedirs(ipp)ifnotos.path.exists(ipp)elseNone;urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler()));open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read());print('Please restart Sublime Text to finish installation') ``` 这个时候重启一下Sublime,可以发现在在菜单栏多了一个如下的栏目,说明Package Control已经安装成功了。 ![](images/1.4.sublime3.png?raw=true) 图1.7 sublime包管理 2. 安装完之后就可以安装Sublime的插件了。需安装GoSublime、SidebarEnhancements和Go Build,安装插件之后记得重启Sublime生效,Ctrl+Shift+p打开Package Controll 输入`pcip`(即“Package Control: Install Package”的缩写)。 这个时候看左下角显示正在读取包数据,完成之后出现如下界面 ![](images/1.4.sublime4.png?raw=true) 图1.8 sublime安装插件界面 这个时候输入GoSublime,按确定就开始安装了。同理应用于SidebarEnhancements和Go Build。 3. 安装 [gocode](https://github.com/nsf/gocode/) go get -u github.com/nsf/gocode gocode 将会安装在默认`$GOBIN` 另外建议安装gotests(生成测试代码): 先在sublime安装gotests插件,再运行: ```Go go get -u -v github.com/cweill/gotests/... ``` 3. 验证是否安装成功,你可以打开Sublime,打开main.go,看看语法是不是高亮了,输入`import`是不是自动化提示了,`import "fmt"`之后,输入`fmt.`是不是自动化提示有函数了。 如果已经出现这个提示,那说明你已经安装完成了,并且完成了自动提示。 如果没有出现这样的提示,一般就是你的`$PATH`没有配置正确。你可以打开终端,输入gocode,是不是能够正确运行,如果不行就说明`$PATH`没有配置正确。 (针对XP)有时候在终端能运行成功,但sublime无提示或者编译解码错误,请安装sublime text3和convert utf8插件试一试 4. MacOS下已经设置了$GOROOT, $GOPATH, $GOBIN,还是没有自动提示怎么办。 请在sublime中使用command + 9, 然后输入env检查$PATH, GOROOT, $GOPATH, $GOBIN等变量, 如果没有请采用下面的方法。 首先建立下面的连接, 然后从Terminal中直接启动sublime ln -s /Applications/Sublime\ Text\ 2.app/Contents/SharedSupport/bin/subl /usr/local/bin/sublime ## LiteIDE LiteIDE是一款专门为Go语言开发的跨平台轻量级集成开发环境(IDE),由visualfc编写。 ![](images/1.4.liteide.png?raw=true) 图1.4 LiteIDE主界面 **LiteIDE主要特点:** * 支持主流操作系统 * Windows * Linux * MacOS X * Go编译环境管理和切换 * 管理和切换多个Go编译环境 * 支持Go语言交叉编译 * 与Go标准一致的项目管理方式 * 基于GOPATH的包浏览器 * 基于GOPATH的编译系统 * 基于GOPATH的Api文档检索 * Go语言的编辑支持 * 类浏览器和大纲显示 * Gocode(代码自动完成工具)的完美支持 * Go语言文档查看和Api快速检索 * 代码表达式信息显示`F1` * 源代码定义跳转支持`F2` * Gdb断点和调试支持 * gofmt自动格式化支持 * 其他特征 * 支持多国语言界面显示 * 完全插件体系结构 * 支持编辑器配色方案 * 基于Kate的语法显示支持 * 基于全文的单词自动完成 * 支持键盘快捷键绑定方案 * Markdown文档编辑支持 * 实时预览和同步显示 * 自定义CSS显示 * 可导出HTML和PDF文档 * 批量转换/合并为HTML/PDF文档 **LiteIDE安装配置** * LiteIDE安装 * 下载地址 * 源码地址 首先安装好Go语言环境,然后根据操作系统下载LiteIDE对应的压缩文件直接解压即可使用。 * 编译环境设置 根据自身系统要求切换和配置LiteIDE当前使用的环境变量。 以Windows操作系统,64位Go语言为例, 工具栏的环境配置中选择win64,点`编辑环境`,进入LiteIDE编辑win64.env文件 GOROOT=c:\go GOBIN= GOARCH=amd64 GOOS=windows CGO_ENABLED=1 PATH=%GOBIN%;%GOROOT%\bin;%PATH% 。。。 将其中的`GOROOT=c:\go`修改为当前Go安装路径,存盘即可,如果有MinGW64,可以将`c:\MinGW64\bin`加入PATH中以便go调用gcc支持CGO编译。 以Linux操作系统,64位Go语言为例, 工具栏的环境配置中选择linux64,点`编辑环境`,进入LiteIDE编辑linux64.env文件 GOROOT=$HOME/go GOBIN= GOARCH=amd64 GOOS=linux CGO_ENABLED=1 PATH=$GOBIN:$GOROOT/bin:$PATH 。。。 将其中的`GOROOT=$HOME/go`修改为当前Go安装路径,存盘即可。 * GOPATH设置 Go语言的工具链使用GOPATH设置,是Go语言开发的项目路径列表,在命令行中输入(在LiteIDE中也可以`Ctrl+,`直接输入)`go help gopath`快速查看GOPATH文档。 在LiteIDE中可以方便的查看和设置GOPATH。通过`菜单-查看-GOPATH`设置,可以查看系统中已存在的GOPATH列表, 同时可根据需要添加项目目录到自定义GOPATH列表中。 ## Atom Atom 是 GitHub 基于 Electron 和 Web 技术构建的开源编辑器, 是一款很漂亮强大的编辑器, 缺点是速度比较慢。 首先要先安装下 Atom,下载地址: https://atom.io/ 然后安装 go-plus 插件: go-plus 是 Atom 上面的一款开源的 go 语言开发环境的的插件 它需要依赖下面的go语言工具: ```Go 1.autocomplete-go :gocode的代码自动提示 2.gofmt :使用goftm,goimports,goturns 3.builder-go:go-install 和go-test,验证代码,给出建议 4.gometalinet-linter:goline,vet,gotype的检查 5.navigator-godef:godef 6.tester-goo :go test 7.gorename :rename ``` 在Atom中的 Preference 中可以找到install菜单,输入 go-plus,然后点击安装(install) 就会开始安装 go-plus , go-plus 插件会自动安装对应的依赖插件,如果没有安装对应的go的类库会自动运行: go get 安装。 ## Vim Vim是从vi发展出来的一个文本编辑器, 代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。 vim-go是vim上面的一款开源的go语言使用最为广泛开发环境的的插件 插件地址:[github.com/fatih/vim-go](https://github.com/fatih/vim-go) vim的插件管理主要有[Pathogen](https://github.com/tpope/vim-pathogen)与[Vundle](https://github.com/VundleVim/Vundle.vim) ,但是其作用的方面不同。 pathogen是为了解决每一个插件安装后文件分散到多个目录不好管理而存在的。vundle是为了解决自动搜索及下载插件而存在的。 这两个插件可同时使用。 1.安装 Vundle ```sh mkdir ~/.vim/bundle git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim ``` 修改.vimrc,将Vundle的相关配置置在最开始处([详细参考Vundle的介绍文档](https://github.com/VundleVim/Vundle.vim)) ```sh set nocompatible " be iMproved, required filetype off " required " set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " let Vundle manage Vundle, required Plugin 'gmarik/Vundle.vim' " All of your Plugins must be added before the following line call vundle#end() " required filetype plugin indent on " required ``` 2.安装Vim-go 修改~/.vimrc,在vundle#begin和vundle#end间增加一行: ```sh Plugin 'fatih/vim-go' ``` 在Vim内执行: PluginInstall 3.安装YCM(Your Complete Me)进行自动补全 在~/.vimrc中添加一行: ```sh Plugin 'Valloric/YouCompleteMe' ``` 在Vim内执行: PluginInstall ![](images/1.4.vim.png?raw=true) 图1.9 VIM编辑器自动化提示Go界面 接着我们继续配置vim: 1. 配置vim高亮显示 cp -r $GOROOT/misc/vim/* ~/.vim/ 2. 在~/.vimrc文件中增加语法高亮显示 filetype plugin indent on syntax on 3. 安装[Gocode](https://github.com/nsf/gocode/) go get -u github.com/nsf/gocode gocode默认安装到`$GOPATH/bin`下面。 4. 配置[Gocode](https://github.com/nsf/gocode/) ~ cd $GOPATH/src/github.com/nsf/gocode/vim ~ ./update.bash ~ gocode set propose-builtins true propose-builtins true ~ gocode set lib-path "/home/border/gocode/pkg/linux_amd64" lib-path "/home/border/gocode/pkg/linux_amd64" ~ gocode set propose-builtins true lib-path "/home/border/gocode/pkg/linux_amd64" >gocode set里面的两个参数的含意说明: > >propose-builtins:是否自动提示Go的内置函数、类型和常量,默认为false,不提示。 > >lib-path:默认情况下,gocode只会搜索**$GOPATH/pkg/$GOOS_$GOARCH** 和 **$GOROOT/pkg/$GOOS_$GOARCH**目录下的包,当然这个设置就是可以设置我们额外的lib能访问的路径 5. 恭喜你,安装完成,你现在可以使用`:e main.go`体验一下开发Go的乐趣。 更多VIM 设定, 可参考[链接](http://www.cnblogs.com/witcxc/archive/2011/12/28/2304704.html) ## Emacs Emacs传说中的神器,她不仅仅是一个编辑器,它是一个整合环境,或可称它为集成开发环境,这些功能如让使用者置身于全功能的操作系统中。 ![](images/1.4.emacs.png?raw=true) 图1.10 Emacs编辑Go主界面 1. 配置Emacs高亮显示 cp $GOROOT/misc/emacs/* ~/.emacs.d/ 2. 安装[Gocode](https://github.com/nsf/gocode/) go get -u github.com/nsf/gocode gocode默认安装到`$GOBIN`里面下面。 3. 配置[Gocode](https://github.com/nsf/gocode/) ~ cd $GOPATH/src/github.com/nsf/gocode/emacs ~ cp go-autocomplete.el ~/.emacs.d/ ~ gocode set propose-builtins true propose-builtins true ~ gocode set lib-path "/home/border/gocode/pkg/linux_amd64" // 换为你自己的路径 lib-path "/home/border/gocode/pkg/linux_amd64" ~ gocode set propose-builtins true lib-path "/home/border/gocode/pkg/linux_amd64" 4. 需要安装 [Auto Completion](http://www.emacswiki.org/emacs/AutoComplete) 下载AutoComplete并解压 ~ make install DIR=$HOME/.emacs.d/auto-complete 配置~/.emacs文件 ;;auto-complete (require 'auto-complete-config) (add-to-list 'ac-dictionary-directories "~/.emacs.d/auto-complete/ac-dict") (ac-config-default) (local-set-key (kbd "M-/") 'semantic-complete-analyze-inline) (local-set-key "." 'semantic-complete-self-insert) (local-set-key ">" 'semantic-complete-self-insert) 详细信息参考: http://www.emacswiki.org/emacs/AutoComplete 5. 配置.emacs ;; golang mode (require 'go-mode-load) (require 'go-autocomplete) ;; speedbar ;; (speedbar 1) (speedbar-add-supported-extension ".go") (add-hook 'go-mode-hook '(lambda () ;; gocode (auto-complete-mode 1) (setq ac-sources '(ac-source-go)) ;; Imenu & Speedbar (setq imenu-generic-expression '(("type" "^type *\\([^ \t\n\r\f]*\\)" 1) ("func" "^func *\\(.*\\) {" 1))) (imenu-add-to-menubar "Index") ;; Outline mode (make-local-variable 'outline-regexp) (setq outline-regexp "//\\.\\|//[^\r\n\f][^\r\n\f]\\|pack\\|func\\|impo\\|cons\\|var.\\|type\\|\t\t*....") (outline-minor-mode 1) (local-set-key "\M-a" 'outline-previous-visible-heading) (local-set-key "\M-e" 'outline-next-visible-heading) ;; Menu bar (require 'easymenu) (defconst go-hooked-menu '("Go tools" ["Go run buffer" go t] ["Go reformat buffer" go-fmt-buffer t] ["Go check buffer" go-fix-buffer t])) (easy-menu-define go-added-menu (current-local-map) "Go tools" go-hooked-menu) ;; Other (setq show-trailing-whitespace t) )) ;; helper function (defun go () "run current buffer" (interactive) (compile (concat "go run " (buffer-file-name)))) ;; helper function (defun go-fmt-buffer () "run gofmt on current buffer" (interactive) (if buffer-read-only (progn (ding) (message "Buffer is read only")) (let ((p (line-number-at-pos)) (filename (buffer-file-name)) (old-max-mini-window-height max-mini-window-height)) (show-all) (if (get-buffer "*Go Reformat Errors*") (progn (delete-windows-on "*Go Reformat Errors*") (kill-buffer "*Go Reformat Errors*"))) (setq max-mini-window-height 1) (if (= 0 (shell-command-on-region (point-min) (point-max) "gofmt" "*Go Reformat Output*" nil "*Go Reformat Errors*" t)) (progn (erase-buffer) (insert-buffer-substring "*Go Reformat Output*") (goto-char (point-min)) (forward-line (1- p))) (with-current-buffer "*Go Reformat Errors*" (progn (goto-char (point-min)) (while (re-search-forward "" nil t) (replace-match filename)) (goto-char (point-min)) (compilation-mode)))) (setq max-mini-window-height old-max-mini-window-height) (delete-windows-on "*Go Reformat Output*") (kill-buffer "*Go Reformat Output*")))) ;; helper function (defun go-fix-buffer () "run gofix on current buffer" (interactive) (show-all) (shell-command-on-region (point-min) (point-max) "go tool fix -diff")) 6. 恭喜你,你现在可以体验在神器中开发Go的乐趣。默认speedbar是关闭的,如果打开需要把 ;; (speedbar 1) 前面的注释去掉,或者也可以通过 *M-x speedbar* 手动开启。 ## Eclipse Eclipse也是非常常用的开发利器,以下介绍如何使用Eclipse来编写Go程序。 ![](images/1.4.eclipse1.png?raw=true) 图1.11 Eclipse编辑Go的主界面 1. 首先下载并安装好[Eclipse](http://www.eclipse.org/) 2. 下载[goclipse](https://code.google.com/p/goclipse/)插件 http://code.google.com/p/goclipse/wiki/InstallationInstructions 3. 下载gocode,用于go的代码补全提示 gocode的GitHub地址: https://github.com/nsf/gocode 在windows下要安装git,通常用[msysgit](https://code.google.com/p/msysgit/) 再在cmd下安装: go get -u github.com/nsf/gocode 也可以下载代码,直接用go build来编译,会生成gocode.exe 4. 下载[MinGW](http://sourceforge.net/projects/mingw/files/MinGW/)并按要求装好 5. 配置插件 Windows->Reference->Go (1).配置Go的编译器 ![](images/1.4.eclipse2.png?raw=true) 图1.12 设置Go的一些基础信息 (2).配置Gocode(可选,代码补全),设置Gocode路径为之前生成的gocode.exe文件 ![](images/1.4.eclipse3.png?raw=true) 图1.13 设置gocode信息 (3).配置GDB(可选,做调试用),设置GDB路径为MingW安装目录下的gdb.exe文件 ![](images/1.4.eclipse4.png?raw=true) 图1.14 设置GDB信息 6. 测试是否成功 新建一个go工程,再建立一个hello.go。如下图: ![](images/1.4.eclipse5.png?raw=true) 图1.15 新建项目编辑文件 调试如下(要在console中用输入命令来调试): ![](images/1.4.eclipse6.png?raw=true) 图1.16 调试Go程序 ## IntelliJ IDEA 熟悉Java的读者应该对于idea不陌生,idea是通过一个插件来支持go语言的高亮语法,代码提示和重构实现。 1. 先下载idea,idea支持多平台:win,mac,linux,如果有钱就买个正式版,如果不行就使用社区免费版,对于只是开发Go语言来说免费版足够用了 ![](images/1.4.idea1.png?raw=true) 2. 安装Go插件,点击菜单File中的Setting,找到Plugins,点击,Broswer repo按钮。国内的用户可能会报错,自己解决哈。 ![](images/1.4.idea3.png?raw=true) 3. 这时候会看见很多插件,搜索找到Golang,双击,download and install。等到golang那一行后面出现Downloaded标志后,点OK。 ![](images/1.4.idea4.png?raw=true) 然后点 Apply .这时候IDE会要求你重启。 4. 重启完毕后,创建新项目会发现已经可以创建golang项目了: ![](images/1.4.idea5.png?raw=true) 下一步,会要求你输入 go sdk的位置,一般都安装在C:\Go,linux和mac根据自己的安装目录设置,选中目录确定,就可以了。 ## links * [目录]() * 上一节: [Go 命令](<01.3.md>) * 下一节: [总结](<01.5.md>)