# 1.4 Go开发工具

本节我将介绍几个开发工具，它们都具有自动化提示，自动化fmt功能。因为它们都是跨平台的，所以安装步骤之类的都是通用的。

## 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安装
	* 下载地址 <http://code.google.com/p/golangide>
	* 源码地址 <https://github.com/visualfc/liteide>
	
	首先安装好Go语言环境，然后根据操作系统下载LiteIDE对应的压缩文件直接解压即可使用。

* 安装Gocode

	启用Go语言的输入自动完成需要安装Gocode：
	
		go get -u github.com/nsf/gocode

* 编译环境设置

	根据自身系统要求切换和配置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列表中。

## Sublime Text

  这里将介绍Sublime Text 2（以下简称Sublime）+GoSublime+gocode+MarGo的组合，那么为什么选择这个组合呢？

  - 自动化提示代码,如下图所示

	![](images/1.4.sublime1.png?raw=true)

	图1.5 sublime自动化提示界面

  - 保存的时候自动格式化代码，让您编写的代码更加美观，符合Go的标准。
  - 支持项目管理
	
	![](images/1.4.sublime2.png?raw=true)
	
	图1.6 sublime项目管理界面
	
  - 支持语法高亮
  - Sublime Text 2可免费使用，只是保存次数达到一定数量之后就会提示是否购买，点击取消继续用，和正式注册版本没有任何区别。


接下来就开始讲如何安装，下载[Sublime](http://www.sublimetext.com/)

  根据自己相应的系统下载相应的版本，然后打开Sublime，对于不熟悉Sublime的同学可以先看一下这篇文章[Sublime Text 2 入门及技巧](http://lucifr.com/139225/sublime-text-2-tricks-and-tips/)

  1. 打开之后安装 Package Control：Ctrl+` 打开命令行，执行如下代码：

		import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; 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. 验证是否安装成功，你可以打开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

  5. 项目支持,让sublime支持项目本身的pkg库提示,有两种基本的实现
  
  一种为设定 gosublime 插件的 `Setting - user` 配置 

		{
			"env": { "GOPATH": "$HOME/golang:$GS_GOPATH" }
		}

  `$GS_GOPATH` 是 gosublime 的伪环境变量, 它自动寻找 `.go`文件所在的 `~/go/src` 来推测 `~/go/` 为项目位置, 从而自动适应 `GOPATH` 。在这里你应当将$HOME/golang换成你自己的go目录路径。（注意：使用这种方式会在sublime内覆盖原有的GOPATH，如果这里设置出错，会产生GOPATH相关的问题）

  另外一种为保存sublime 项目 , 修改 project_name.sublime-project 添加节点


		"settings": {
			"GoSublime": {
				"env": {
					"GOPATH": "$HOME/golang/pwd" // 此处修改为项目路径
				}
			}
		},

		"folders"{...



## Vim
Vim是从vi发展出来的一个文本编辑器, 代码补全、编译及错误跳转等方便编程的功能特别丰富，在程序员中被广泛使用。

![](images/1.4.vim.png?raw=true)

图1.9 VIM编辑器自动化提示Go界面

 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默认安装到`$GOBIN`下面。

 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://monnand.me/p/vim-golang-environment/zhCN/)

## 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 "<standard input>" 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
   * [目录](<preface.md>)
   * 上一节: [Go 命令](<01.3.md>)
   * 下一节: [总结](<01.5.md>)
