apt-get install golang -y
/user/local
目录下,输入如下命令查看。ls /user/local/
wget https://golang.google.cn/dl/go1.19.5.linux-amd64.tar.gz
tar -xzf go1.19.5.linux-amd64.tar.gz
/usr/local/
目录下,移动解压后生成的 go 文件夹到 /usr/local/
目录下。
/usr/
:系统软件安装目录。
/usr/local/
:用户软件安装目录。
/opt/
:大型软件安装目录。
一、终端下命令(移动)
sudo mv go /usr/local/
二、终端下 命令(拷贝)
sudo cp -r go /usr/local/
$HOME/.profile
或 ~/.bashrc
配置文件。vim $HOME/.profile
或者:
vim ~/.bashrc
注:
$HOME/.profile
对系统当前用户有效,~/.bashrc
对所有用户有效。
关于环境变量 GOPATH
、PATH
、GOROOT
、GOBIN
的介绍。
- GOROOT 是 Golang 源代码目录安装路径。
- GOPATH 是 Golang 项目代码目录(工作空间)。
- PATH 是 Golang 安装路径下的 bin 目录。
- GOBIN 是 go install 后生成的可执行命令存放路径。
export GOROOT=/usr/local/go
export GOPATH=$HOME/gocode
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
export GOBIN=$GOPATH/bin
环境变量配置位置如下:
source $HOME/.profile
或者:
source ~/.bashrc
go env -w GOPROXY=https://goproxy.cn,direct
如果要取消代理,可输入命令
go env -u GOPROXY
。
go env
或者
go env -json // 表示以 json 格式输出 Go 的配置
go version
后能看到版本号就表示安装成功了,以上安装的是 go1.19.3 linux/amd64
版本。输出的环境变量和版本号信息:
$HOME
目录下创建了一个 gocode 文件夹,输入如下命令: mkdir $HOME/gocode
/etc/profile
配置文件。vim $HOME/.profile
export GOPATH=$HOME/gocode
source $HOME/.profile
cd $GOPATH
Go 的代码在 GOPATH 中,也就是一个工作目录,该目录下包含 bin
、pkg
、src
这三个子目录。
src
:存放 Go 源代码的目录,一般创建 Go 的项目放到 GOPATH 的 src 目录下。
bin
:在 go install 后生成的可执行文件的目录。
pkg
:编译后生成的源码文件。
src
文件夹内,可以先看一下有没有这三个文件,若没有则创建没有的文件。mkdir bin pkg src
test
,进入该目录下创建 test.go
文件,编写程序,保存并运行。mkdir -p $GOPATH/src/test
cd $GOPATH/src/test/
package main
import "fmt"
func main(){
fmt.Println("Hi CQUPT!")
}
具体编写程序的过程及运行结果如下:
go env -w GO111MODULE=auto
test
文件夹),进入项目目录初始化,依次输入如下命令:mkdir test
cd test
go mod init test
Go Mod 初始化项目过程如下:
xxx.go
文件,编写如下程序内容:package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func main(){
// 创建默认的路由引擎
r := gin.Default()
// GET:请求方式; /hello:请求路径
r.GET("/cqupthao",func(c *gin.Context){
// HTTP 重定向到指定网址
c.Redirect(http.StatusMovedPermanently, "http://cqupthao.github.io")
})
//启动 HTTP 服务,默认地址在 127.0.0.1:8080
r.Run()
}
go mod tidy
依赖包下载过程如下:
下载完成后,项目文件的具体内容如下:
127.0.0.1:8080/cqupthao
正确重定向道指定网址 http://cqupthao.github.io
。运行程序访问指定网址后的结果:
重定向到网址 http://cqupthao.github.io 的首页:
GO 语言的部分环境变量介绍。
/usr/local/go
文件夹 (如果存在),输入如下命令:apt-get remove golang golang-go -y
apt-get autoremove -y
rm -rf /usr/local/go
~/.bashrc
或 $HOME/.profile
配置文件,使配置文件更改立即生效,输入如下的命令:source $HOME/.profile
/usr/local
目录中,创建一个新的转到 /usr/local/go
中的树,输入如下命令:tar -C /usr/local -xzf go1.19.5.linux-amd64.tar.gz
注意
:不要将归档文件解压缩到现有的/usr/local/go
树中,以免产生损坏的 Go安装。
go version
go env
输出的环境变量和版本号信息:
vim-go
是当前使用最为广泛的用于搭建 Golang 开发环境的 vim 插件。
$HOME
目录下创建 .vim
目录和 .vimrc
配置文件。mkdir $HOME/.vim
touch $HOME/.vimrc
.vim
目录中,下载插件 vim 的插件管理器 bundle
。cd ~/.vim
mkdir bundle
Vundle.vim
。cd ~/.vim/bundle/
git clone https://github.com/VundleVim/Vundle.vim.git
Vundle.vim
文件,同样进入到 bundle 目录中,安装 vim-go
。cd ~/.vim/bundle/
git clone https://github.com/fatih/vim-go.git
下载完成之后,会在当前目录下生成
vim-go
目录。
~/
(用户$HOME
) 目录下已经有.vimrc
文件就不需要再创建了。
.vimrc
配置文件,添加如下内容:set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim'
call vundle#end()
filetype plugin indent on
.vimrc
配置文件,在 call vundle#begin()
和 call vundle#end()
之间再添加如下内容:Plugin 'fatih/vim-go'
:PluginInstall
执行之后会在左侧出现需要安装的插件列表,右侧是
.vimrc
文件,刚执行时,左下角会出现 Processing 的过程,需要稍微等一会儿,下载代码安装完成之后,左下角将出现 Done! 的单词表示已经安装完成。
.vimrc
文件,切换到命令行模式,执行 GoInstallBinaries
命令自行安装。:GoInstallBinaries
$GOPATH/bin
目录下会生成 vim-go 依赖的命令文件。由于有些命令文件是无法自动安装完成,就需要手动进行安装。首先对比目录,看缺少哪些命令没有安装完成,然后去 GitHub上搜索,找到对应的命令源码之后,使用 git clone 下载到本地,然后使用 go install 命令进行安装即可。
相关工具的 GitHub 路径:
golint
: https://github.com/golang/lint.git
gocode
: https://github.com/nsf/gocode.git
errcheck
: https://github.com/kisielk/errcheck.git
gotags
: https://github.com/jstemmer/gotags.git
NERDTree 的作用就是列出当前路径的目录树,可以方便的浏览项目的总体的目录结构和创建删除重命名文件或文件名,在 .vimrc
配置文件中添加如下内容:
Plugin 'scrooloose/nerdtree'
map :NERDTreeMirror
map :NERDTreeToggle
进入到 vim 后可以按 F7 显示和隐藏 NERDTree 区域。
GitHub 的代码路径如下所示:
scrooloose/nerdtree
: https://github.com/scrooloose/nerdtree.git
tagbar 可以将正在编辑的文件生成一个大纲视图,包含接口 / 方法/变量等,可以选中快速跳转到目标位置,tagbar 是基于 ctags ,需要先安装 ctags ,输入如下命令安装:
apt-get install ctags -y
.vimrc
配置文件添加如下内容:" F9 触发,设置宽度为 30
let g:tagbar_width = 30
nmap :TagbarToggle
" 开启自动预览(随着光标在标签上的移动,顶部会出现一个实时的预览窗口)
let g:tagbar_autopreview = 1
" 关闭排序,即按标签本身在文件中的位置排序。
let g:tagbar_sort = 0
进入到 vim 后可以按 F9 开启和关闭 tagbar 功能 。
GitHub 的代码路径如下所示:
majutsushi/tagbar
: https://github.com/majutsushi/tagbar.git
delimitMate 是自动补全引号(单引号/双引号/反引号), 括号 (()[]{})
的插件,在 .vimrc
配置文件中添加如下内容:
Plugin 'Raimondi/delimitMate'
GitHub 的代码路径如下所示:
Raimondi/delimitMate
: https://github.com/Raimondi/delimitMate.git
– 执行:GoImports,Vim会自动导入 time 包。
– 执行:GoDef 或命令模式下敲入 gd ,vim 会打开 $GOROOT/src/time/sleep.go 中 的 Sleep 函数的定义。
– 执行:GoLint ,运行 golint 在当前 Go 源文件上。
– 执行:GoDoc ,打开当前光标对应符号的 Go 文档。
– 执行:GoVet ,在当前目录下运行 go vet 在当前 Go 源文件上。
– 执行:GoRun ,编译运行当前 main package 。
– 执行:GoBuild ,编译当前包,这取决于源文件,GoBuild 不产生结果文件。
– 执行:GoInstall ,安装当前包。
– 执行:GoTest ,测试你当前路径下地_test.go文件。
– 执行:GoCoverage ,创建一个测试覆盖结果文件,并打开浏览器展示当前包的情况。
– 执行:GoErrCheck ,检查当前包种可能的未捕获的 errors 。
– 执行:GoFiles ,显示当前包对应的源文件列表。
– 执行:GoDeps ,显示当前包的依赖包列表。
– 执行:GoImplements ,显示当前类型实现的 interface 列表。
– 执行:GoRename [to] ,将当前光标下的符号替换为 [to] 。
vim 的主题颜色保存在 /usr/share/vim/vim81/colors/
目录下,下载到该目录的颜色主题将可以被所有用户使用。如果只需要在当前用户下使用,可以将下载的主题放在 ~/.vim/colors
目录下,若没有这个目录创建一个即可。
下面以
molokai
主题风格为例进行简单配置说明。
在 GitHub 上搜索 molokai 主题,找到主题的 git 仓库 tomasr/molokai
。
进入到 /usr/share/vim/vim81/colors/
目录下,使用 git clone 下载主题。下载完成之后,拷贝 molokai/colors/molokai.vim
文件到 ~/.vim/colors/
目录下
cd $HOME/.vim/
git clone https://github.com/tomasr/molokai.git
.vimrc
配置文件中添加如下内容:set t_Co=256
colorscheme molokai
let g:molokai_original = 1
let g:rehash256 = 1
需要配置其他的主题,只需要设置相应的主题名称。
set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set encoding=utf-8
set gfn=Consolas:h12 " 字体,大小
"=============================================================================
" vim 内置配置
"==============================================================================
" 设置 vimrc 修改保存后立刻生效,不用在重新打开
" 配置完成后将这个关闭
autocmd BufWritePost $MYVIMRC source $MYVIMRC
filetype off " 关闭兼容模式
set nocompatible " 不使用 vi 的键盘模式,而是 vim
set showcmd " 显示命令行
set backspace=indent,eol,start
set clipboard+=unnamed
set nu " 设置行号
syntax on " 开启语法高亮
set cursorline " 突出显示当前行
set cursorcolumn " 突出显示当前列
set showmatch " 显示括号匹配
set backspace=2 " Tab 缩进
set tabstop=4 " 设置 Tab 长度为 4 空格
set shiftwidth=4 " 设置自动缩进长度为 4 空格
set noswapfile " 不生成 swap 文件
set autoindent " 继承前一行的缩进方式,适用于多行注释
set ruler " 打开状态栏标尺
set laststatus=2 " 总是显示状态行
set showtabline=2 " 标签栏的显示,0 永远不显示 1 两个以上显示 2 永远显示
set statusline=%F%m%r%h%w\[POS=%l,%v][%p%%]\%{strftime(\"%d/%m/%y\ -\ %H:%M\")} "我的状态行显示的内容(包括文件类型和解码)
set hlsearch " 搜索时高亮显示被找到的文本
set foldmethod=syntax " 代码折叠
set fdm=indent " 代码折叠
set foldlevel=100 " 启动 vim 时不要自动折叠代码
nnoremap zo " 代码折叠快捷键
let autosave=15 " 15s 自动保存文件
let mapleader="," " 定义快捷键的前缀,即
nnoremap w :WMToggle
" ==== 系统剪切板复制粘贴 ====
" v 模式下复制内容到系统剪切板
vmap c "+yy
" n 模式下复制一行到系统剪切板
nmap c "+yy
" n 模式下粘贴系统剪切板的内容
nmap v "+p
imap " 开启实时搜索
set incsearch " 搜索时大小写不敏感
set ignorecase
syntax enable
:inoremap ( ()i
:inoremap ) =ClosePair(')')
:inoremap { {}O
:inoremap } =ClosePair('}')
:inoremap [ []i
:inoremap ] =ClosePair(']')
:inoremap " ""i
:inoremap ' ''i
function! ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\"
else
return a:char
endif
endfunction
" 退出插入模式指定类型的文件自动保存
au InsertLeave *.go,*.sh,*.php write
"==============================================================================
" Plugin
"==============================================================================
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
" Install Vim-go
Plugin 'fatih/vim-go'
Plugin 'tpope/vim-fugitive'
Plugin 'scrooloose/nerdtree'
Plugin 'majutsushi/tagbar'
Plugin 'Valloric/YouCompleteMe'
" 代码自动完成,安装完插件还需要额外配置才可以使用
"Plugin 'ycm-core/YouCompleteMe'
call vundle#end() " required
"==============================================================================
" 主题配色
"==============================================================================
" 开启24bit的颜色,开启这个颜色会更漂亮一些
" set termguicolors
" 配色方案, 可以从上面插件安装中的选择一个使用
"colorscheme one " 主题
"set background=dark " 主题背景 dark-深色; light-浅色
filetype plugin indent on
syntax on " 开启文件类型侦测
"==============================================================================
" vim-go 插件
"==============================================================================
let g:go_fmt_command = "goimports" " 格式化将默认的 gofmt 替换
let g:go_debug=['shell-commands']
let g:go_metalinter_command = "golangci-lint" "语法校验
let g:go_autodetect_gopath = 1
let g:go_list_type = "quickfix"
let g:go_version_warning = 1
let g:go_highlight_types = 1
let g:go_highlight_fields = 1
let g:go_highlight_functions = 1
let g:go_highlight_function_calls = 1
let g:go_highlight_operators = 1
let g:go_highlight_extra_types = 1
let g:go_highlight_methods = 1
let g:go_highlight_generate_tags = 1
let g:godef_split=2
" 设置 vim-go 快捷键
" vim-go custom mappings
au FileType go nmap s (go-implements)
au FileType go nmap i (go-info)
au FileType go nmap gd (go-doc)
au FileType go nmap gv (go-doc-vertical)
au FileType go nmap r (go-run)
au FileType go nmap b (go-build)
au FileType go nmap t (go-test)
au FileType go nmap c (go-coverage)
au FileType go nmap ds (go-def-split)
au FileType go nmap dv (go-def-vertical)
au FileType go nmap dt (go-def-tab)
au FileType go nmap e (go-rename)
"==============================================================================
" auto-pairs 插件
"==============================================================================
"let g:AutoPairsFlyMode = 0
"let g:AutoPairsShortcutBackInsert = ''
"==============================================================================
" NERDTree 插件
"==============================================================================
" 打开和关闭 NERDTree 快捷键
map :NERDTreeToggle
nnoremap n :NERDTreeToggle
" 显示行号
let NERDTreeShowLineNumbers=1
" 打开文件时是否显示目录
let NERDTreeAutoCenter=0
" 是否显示隐藏文件
let NERDTreeShowHidden=0
" 设置宽度
let NERDTreeWinSize=25
" 忽略一下文件的显示
let NERDTreeIgnore=['\.pyc','\~$','\.swp']
" 打开 vim 文件及显示书签列表
let NERDTreeShowBookmarks=2
" 在终端启动vim时,共享 NERDTree
let g:nerdtree_tabs_open_on_console_startup=1
"==============================================================================
" majutsushi/tagbar 插件
"==============================================================================
" majutsushi/tagbar 插件打开关闭快捷键
nmap :TagbarToggle
"nnoremap t :TagbarToggle
"nmap tb :TagbarToggle
let g:tagbar_ctags_bin='/usr/bin/ctags'
let g:tagbar_width=30
"autocmd BufReadPost *.go,*.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()
let g:tagbar_type_go = {
\ 'ctagstype' : 'go',
\ 'kinds' : [
\ 'p:package',
\ 'i:imports:1',
\ 'c:constants',
\ 'v:variables',
\ 't:types',
\ 'n:interfaces',
\ 'w:fields',
\ 'e:embedded',
\ 'm:methods',
\ 'r:constructor',
\ 'f:functions'
\ ],
\ 'sro' : '.',
\ 'kind2scope' : {
\ 't' : 'ctype',
\ 'n' : 'ntype'
\ },
\ 'scope2kind' : {
\ 'ctype' : 't',
\ 'ntype' : 'n'
\ },
\ 'ctagsbin' : 'gotags',
\ 'ctagsargs' : '-sort -silent'
\ }
"==============================================================================
" nerdtree-git-Plugin 插件
"==============================================================================
let g:NERDTreeGitStatusIndicatorMapCustom = {
\ "Modified" : "✹",
\ "Staged" : "✚",
\ "Untracked" : "✭",
\ "Renamed" : "➜",
\ "Unmerged" : "═",
\ "Deleted" : "✖",
\ "Dirty" : "✗",
\ "Clean" : "✔︎",
\ 'Ignored' : '☒',
\ "Unknown" : "?"
\ }
let g:NERDTreeGitStatusShowIgnored = 1
"==============================================================================
" Valloric/YouCompleteMe 插件
"==============================================================================
let g:ycm_server_python_interpreter='/usr/bin/python3.6'
let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'
"是否开启语义补全"
let g:ycm_seed_identifiers_with_syntax=1
"是否在注释中也开启补全"
let g:ycm_complete_in_comments=1
let g:ycm_collect_identifiers_from_comments_and_strings = 0
"开始补全的字符数"
let g:ycm_min_num_of_chars_for_completion=2
"补全后自动关机预览窗口"
let g:ycm_autoclose_preview_window_after_completion=1
" 禁止缓存匹配项,每次都重新生成匹配项"
let g:ycm_cache_omnifunc=0
"字符串中也开启补全"
let g:ycm_complete_in_strings = 1
let g:ycm_show_diagnostics_ui = 0 " 关闭语法提示
let g:ycm_complete_in_comments=1 " 补全功能在注释中同样有效
let g:ycm_confirm_extra_conf=0 " 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示
let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 标签补全引擎
let g:ycm_min_num_of_chars_for_completion=1 " 从第一个键入字符就开始罗列匹配项
let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
let g:ycm_goto_buffer_command = 'horizontal-split' " 跳转打开上下分屏
"离开插入模式后自动关闭预览窗口"\
autocmd InsertLeave * if pumvisible() == 0|pclose|endif
"回车即选中当前项"
"inoremap pumvisible() ? '' : '\'
" better key bindings for UltiSnipsExpandTrigger
"let g:UltiSnipsExpandTrigger = ""
"let g:UltiSnipsJumpForwardTrigger = ""
"let g:UltiSnipsJumpBackwardTrigger = ""
"==============================================================================
" easymotion/vim-easymotion
"==============================================================================
"let g:EasyMotion_do_mapping = 0 " Disable default mappings"
" --暂时停用下面一行 @kevin 2019-7-18
"let g:EasyMotion_leader_key = ''
" Bi-directional find motion
" Jump to anywhere you want with minimal keystrokes, with just one key binding.
" `s{char}{label}`
" --暂时停用下面一行 @kevin 2019-7-18
"map s (easymotion-s)
" or
" `s{char}{char}{label}`
" Need one more keystroke, but on average, it may be more comfortable.
""nmap s (easymotion-s2)
""map t (easymotion-t2)
" Turn on case insensitive feature
"let g:EasyMotion_smartcase = 0
" JK motions: Line motions
"map j (easymotion-j)
"map k (easymotion-k)
" search
"map // (easymotion-sn)
"omap // (easymotion-tn)
"==============================================================================
" ctrlp 插件
"==============================================================================
map :CtrlPMixed
let g:ctrlp_by_filename = 0
let g:ctrlp_regexp=1
let g:ctrlp_working_path_mode = 'rw'
let g:ctrlp_working_path_mode="ra"
let g:ctrlp_lazy_update=1
let g:ctrlp_use_caching=1
let g:ctrlp_cache_dir=$HOME.'/.vim/.cache/ctrlp'
let g:ctrlp_clear_cache_on_exit=1
let g:ctrlp_max_depth=20
let g:ctrlp_max_height=15
set wildignore+=*/.git/*,*/.hg/*,*/.svn/*
let g:ctrlp_custom_ignore={
\ 'dir': '\v[\/]\.(git|hg|svn)$',
\ 'file': '\v\.(exe|so|dll|a|o|tar|tar.gz|pyc|zip)$',
\ 'link': 'SOME_BAD_SYMBOLIC_LINKS',
\ }
"==============================================================================
" 多标签支持(minibuf)
"==============================================================================
let g:miniBufExplMapWindowNavVim=1
let g:miniBufExplMapWindowNavArrows=1
let g:miniBufExplMapCTabSwitchBufs=1
let g:miniBufExplModSelTarget=1
let g:miniBufExplorerMoreThanOne=0
hi MBEVisibleActive guifg=#A6DB29 guibg=fg
hi MBEVisibleChangedActive guifg=#F1266F guibg=fg
hi MBEVisibleChanged guifg=#F1266F guibg=fg
hi MBEVisibleNormal guifg=#5DC2D6 guibg=fg
hi MBEChanged guifg=#CD5907 guibg=fg
hi MBENormal guifg=#808080 guibg=fg
"==============================================================================
" 其他插件配置
"==============================================================================
" markdwon 的快捷键
map MarkdownPreview
map StopMarkdownPreview
" tab 标签页切换快捷键
:nn 1 1gt
:nn 2 2gt
:nn 3 3gt
:nn 4 4gt
:nn 5 5gt
:nn 6 6gt
:nn 7 7gt
:nn 8 8gt
:nn 9 8gt
:nn 0 :tablast
set t_Co=256
colorscheme molokai
"colorscheme one
set background=dark " 主题背景 dark-深色; light-浅色
下载安装 VS Code
官方下载地址,点击运行。
点击左侧菜单栏最后一项 管理扩展
,在 搜索框
中输入 chinese
,选中结果列表第一项,点击 install
安装。
重启 VS Code
,重启之后,VS Code 就可以中文显示!Go
语言扩展插件,让它支持 Go 语言开发。GOPROXY
,打开终端执行以下命令:go env -w GOPROXY=https://goproxy.cn,direct
Windows 平台按下
Ctrl+Shift+P
,Mac平台按Command+Shift+P
,
>go:install
,下面会自动搜索相关命令,选择 Go:Install/Update Tools
这个命令,按照下图选中并回车执行该命令(或者使用鼠标点击该命令)。确定
按钮,进行安装。文件 -> 首选项 -> 设置
。配置 VS Code 代码片段快捷键。
Ctrl/Command+Shift+P
,按下图输入 >snippets
,选择命令并执行,在弹出的窗口点击选择 go
选项。上图的注释介绍了主要的用法:
“此处放名字”:{
"prefix": "这是快捷键",
"body": "这里是按快捷键插入的代码片段",
"description": "这里放提示信息的描述"
}
其中 $0
表示最终光标提留的位置。 例如在这里创建两个快捷方式,一个是输入 pln
就会在编辑器中插入 fmt.Println()
代码;另一个是输入 plf
,就会插入 fmt.Printf("")
代码。具体配置如下:
{
"println":{
"prefix": "pln",
"body":"fmt.Println($0)",
"description": "println"
},
"printf":{
"prefix": "plf",
"body": "fmt.Printf(\"$0\")",
"description": "printf"
}
}
设置 -> 颜色主题
。参考 Go 中文网
参考 Go 官网
参考 Vim 官网
参考 vim-go
参考 Tony Bai 的博客