1.4 Go开发工具

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

LiteIDE

LiteIDE是一款专门为Go语言开发的跨平台轻量级集成开发环境(IDE),由visualfc编写。

图1.4 LiteIDE主界面

LiteIDE主要特点:

F1F2

LiteIDE安装配置

  GOROOT=c:\go
  GOBIN=
  GOARCH=amd64
  GOOS=windows
  CGO_ENABLED=1

  PATH=%GOBIN%;%GOROOT%\bin;%PATH%
  。。。
  GOROOT=$HOME/go
  GOBIN=
  GOARCH=amd64
  GOOS=linux
  CGO_ENABLED=1

  PATH=$GOBIN:$GOROOT/bin:$PATH	
  。。。

Sublime Text

这里将介绍Sublime Text 3(以下简称Sublime)+ GoSublime + gocode的组合,那么为什么选择这个组合呢?

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

    图1.5 sublime自动化提示界面

  • 保存的时候自动格式化代码,让您编写的代码更加美观,符合Go的标准。

  • 支持项目管理

    图1.6 sublime项目管理界面

  • 支持语法高亮

  • Sublime Text 3可免费使用,只是保存次数达到一定数量之后就会提示是否购买,点击取消继续用,和正式注册版本没有任何区别。

接下来就开始讲如何安装,下载 Sublime

根据自己相应的系统下载相应的版本,然后打开Sublime,对于不熟悉Sublime的同学可以先看一下这篇文章Sublime Text 全程指南或者sublime text3入门教程

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

适用于 Sublime Text 3:

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(' ',' ')).read())

适用于 Sublime Text 2:

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(' ',' ')).read());print('Please restart Sublime Text to finish installation')

这个时候重启一下Sublime,可以发现在在菜单栏多了一个如下的栏目,说明Package Control已经安装成功了。

图1.7 sublime包管理
pcip

这个时候看左下角显示正在读取包数据,完成之后出现如下界面

图1.8 sublime安装插件界面

这个时候输入GoSublime,按确定就开始安装了。同理应用于SidebarEnhancements和Go Build。

gocode 将会安装在默认`$GOBIN`

另外建议安装gotests(生成测试代码):

先在sublime安装gotests插件,再运行:
go get -u -v github.com/cweill/gotests/...
importimport "fmt"fmt.

如果已经出现这个提示,那说明你已经安装完成了,并且完成了自动提示。

$PATH$PATH
  1. 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

Visual Studio Code

vscode是微软基于Electron和web技术构建的开源编辑器, 是一款很强大的编辑器。开源地址:https://github.com/Microsoft/vscode

1、安装Visual Studio Code 最新版

官方网站:https://code.visualstudio.com/ 下载Visual Studio Code 最新版,安装过程略。

2、安装Go插件

点击右边的 Extensions 图标 搜索Go插件 在插件列表中,选择 Go,进行安装,安装之后,系统会提示重启 Visual Studio Code。

建议把自动保存功能开启。开启方法为:选择菜单 File,点击 Auto save。

vscode代码设置可用于Go扩展。这些都可以在用户的喜好来设置或工作区设置(.vscode/settings.json)。

打开首选项-用户设置 settings.json:


{
    "go.buildOnSave": true,
    "go.lintOnSave": true,
    "go.vetOnSave": true,
    "go.buildFlags": [],
    "go.lintFlags": [],
    "go.vetFlags": [],
    "go.coverOnSave": false,
    "go.useCodeSnippetsOnFunctionSuggest": false,
    "go.formatOnSave": true,
    //goimports
    "go.formatTool": "goreturns",
    "go.goroot": "",//你的Goroot
    "go.gopath": "",//你的Gopath
}

接着安装依赖包支持(网络不稳定,请直接到 Github Golang 下载再移动到相关目录):

go get -u -v github.com/nsf/gocode
go get -u -v github.com/rogpeppe/godef
go get -u -v github.com/zmb3/gogetdoc
go get -u -v github.com/golang/lint/golint
go get -u -v github.com/lukehoban/go-outline
go get -u -v sourcegraph.com/sqs/goreturns
go get -u -v golang.org/x/tools/cmd/gorename
go get -u -v github.com/tpng/gopkgs
go get -u -v github.com/newhook/go-symbols
go get -u -v golang.org/x/tools/cmd/guru
go get -u -v github.com/cweill/gotests/...

vscode 还有一项很强大的功能就是断点调试,结合 delve 可以很好的进行 Go 代码调试


go get -v -u github.com/peterh/liner github.com/derekparker/delve/cmd/dlv

brew install go-delve/delve/delve(mac可选)

如果有问题再来一遍:

go get -v -u github.com/peterh/liner github.com/derekparker/delve/cmd/dlv

注意:修改"dlv-cert"证书, 选择"显示简介"->"信任"->"代码签名" 修改为: 始终信任

打开首选项-工作区设置,配置launch.json:

{
    "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
        }
    ]
}

Atom

Atom是Github基于Electron和web技术构建的开源编辑器, 是一款很漂亮强大的编辑器缺点是速度比较慢。

首先要先安装下Atom,下载地址: https://atom.io/

然后安装go-plus插件:

go-plus是Atom上面的一款开源的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 安装。

GoLand

GoLand 是 JetBrains 公司推出的 Go 语言集成开发环境,是 Idea Go 插件的强化版。GoLand 同样基于 IntelliJ 平台开发,支持 JetBrains 的插件体系。

下载地址: https://www.jetbrains.com/go/

Vim

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

vim-go是vim上面的一款开源的go语言使用最为广泛开发环境的的插件

vim的插件管理主要有Pathogen与Vundle ,但是其作用的方面不同。 pathogen是为了解决每一个插件安装后文件分散到多个目录不好管理而存在的。vundle是为了解决自动搜索及下载插件而存在的。 这两个插件可同时使用。

1.安装Vundle

mkdir ~/.vim/bundle
git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim

修改.vimrc,将Vundle的相关配置置在最开始处(详细参考Vundle的介绍文档)

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间增加一行:


Plugin 'fatih/vim-go'

在Vim内执行: PluginInstall

3.安装YCM(Your Complete Me)进行自动补全 在~/.vimrc中添加一行:


Plugin 'Valloric/YouCompleteMe'

在Vim内执行: PluginInstall

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

接着我们继续配置vim:

cp -r $GOROOT/misc/vim/* ~/.vim/
filetype plugin indent on
syntax on
go get -u 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"

更多VIM 设定, 可参考链接

Emacs

Emacs传说中的神器,她不仅仅是一个编辑器,它是一个整合环境,或可称它为集成开发环境,这些功能如让使用者置身于全功能的操作系统中。

图1.10 Emacs编辑Go主界面

 cp $GOROOT/misc/emacs/* ~/.emacs.d/
 go get -u 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"
 ;;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)
 ;; 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"))

Eclipse

Eclipse也是非常常用的开发利器,以下介绍如何使用Eclipse来编写Go程序。

图1.11 Eclipse编辑Go的主界面

 https://github.com/nsf/gocode
 go get -u github.com/nsf/gocode

(1).配置Go的编译器

图1.12 设置Go的一些基础信息

(2).配置Gocode(可选,代码补全),设置Gocode路径为之前生成的gocode.exe文件

图1.13 设置gocode信息

(3).配置GDB(可选,做调试用),设置GDB路径为MingW安装目录下的gdb.exe文件

图1.14 设置GDB信息

IntelliJ IDEA

熟悉Java的读者应该对于idea不陌生,idea是通过一个插件来支持go语言的高亮语法,代码提示和重构实现。

links