开发工具
liteide
调试时unable to initialize decompress status for section .zdebug_abbrev,工具栏 调试(D) -----> 选中 debugger/delve 将debugger 从 gdb 切换成 delve 就可以正常debug了
eclipse + GoClipse插件
image.png
注意
Executable file doesn't exist,请删掉环境变量GOBIN,同时确保GOPATH和GOROOT不一样
上述例子中的源代码写成package hello也能成功执行
“Resource doesn't have a corresponding Go package可以通过两种方式解决,要么把GOPATH设置为当前项目目录,要么把当前项目放到GOPATH/src/yourproject目录。参考Workspaces, src不能直接放源代码,src下面还要有子目录
代码提示和自动补全功能需要安装gocode, 如果go get -u -v github.com/nsf/gocode无法下载,可以把gocode的路径指向liteide的bin目录下的gocode。正常情况点击下图中的download按钮可以自动下载,
image.png
debug需要是使用GDB, 路径指向liteide的GDB或者Mingw-w64的GDB即可,但实际上经常会报错。
VS Code + go插件
插件名字就叫go, 安装好后创建一个空文件夹,VSCODE打开空文件夹,在里面创建main.go,这时候VSCODE会提示需要安装插件,按照提示选择install all让它自动安装即可。如果出错可以参考这里。
Go现在的调试工具支持的都不太好,可以使用GDB或者Delve(还有已经过气的godebug), 但GDB在WINDOWS上支持的不好,最好用MAC或者LINUX
语法
每行末尾可以使用分号,也可以不使用分号
申明的变量必须使用否则会报错 declared and not used
:=赋值操作只能在函数内部使用,否则会报错syntax error: non-declaration statement outside function body
切片和数组的区别
声明时的区别:声明数组时,方括号内写明了数组的长度或使用...自动计算长度,而声明slice时,方括号内没有任何字符。
//定义数组:指定长度
var x [3]int = [3]int{1, 2, 3}
var array = [10]byte{'a','b','c','d','e','f','g','h','i','j'}
//定义数组:不指定长度
var y = [...]int{1, 2, 3}
//定义切片
var x2 []int = []int{1, 2, 3}
var y2 = y[0:1]
var z2 []int
//go不支持在函数外赋值与调用操作, 但可以声明一个变量或者声明并初始化一个变量
// z2 = x[0:1] // syntax error: non-declaration statement outside function body
构建项目
常见工具有makefile, gradle, maven。当然了,简单项目,go run或者go build命令就足够了,不需要什么makefile或gradle。
采用Glide对Golang进行包管理
最简单的包管理就是用go get解决依赖,复杂一点的可以使用一些包管理工具。
常见包管理工具:
#安装glide
pilot@ubuntu:~$go get github.com/Masterminds/glide
pilot@ubuntu:~$cd github.com/Masterminds/glide
# 注意,如果是离线安装的话,需要执行 go install
pilot@ubuntu:~$make build
pilot@ubuntu:~$go build -o glide -ldflags "-X main.version=v0.11.0" glide.go
#或者,如果是ubuntu,可以使用如下方式安装
$ sudo add-apt-repository ppa:masterminds/glide && sudo apt-get update
$ sudo apt-get install glide
#在项目的 根目录运行下面的命令产生 glide.yaml,Glide 能检测项目的依赖包 并且 创建一个名为 glide.yaml 的文件。能自动识别 Godep, GPM, Gom, and GB 等工具的配置文件。
pilot@ubuntu:~$glide init
#更新依赖包 执行如下命令,依据配置文件 glide.yaml 的内容,计算各个依赖包的精确版本号
pilot@ubuntu:~$glide up
#下载安装依赖包。这个命令会做以下 2 件事: (1) 如果 glide.lock 文件已经存在,Glide 会把 glide.lock 中已经计算好的确定版本号的依赖包批量下载到 vendor/ 目录下; (2) 如果 glide.local 文件不存在,则会先执行 update 命令;
pilot@ubuntu:~$glide install
#增加更多的 依赖包 使用 get 命令,Glide 能帮你添加更多的依赖包到 glide.yaml 文件中,如下所示。glide get 命令功能 类似 go get,但是它会把依赖包下载到 vendor/ 目录,并且把相关信息配置到 glide.yaml 文件。这个 get 命令 也可以带版本号。glide 会把下载下来的包缓存到 ~/.glide/cache 目录下 。
pilot@ubuntu:~$glide get github.com/Masterminds/semver #glide get github.com/Masterminds/semver#~1.2.0
glide init 初始化更新都非常慢
[ERROR] Update failed for golang.org/x/crypto/blowfish: Cannot detect VCS
解决方法:指向github
修改glide.yaml文件中的
package golang.org/x/crypto/blowfish为github.org/golang/crypto/blowfish
或者通过如下方式:
$ rm -rf ~/.glide
$ mkdir -p ~/.glide
$ glide mirror set https://golang.org/x/crypto/blowfish https://github.org/golang/crypto/blowfish --vcs git
$ glide mirror set https://google.golang.org/api/compute/v1 https://github.com/googleapis/google-api-go-client/compute --vcs git
$ glide mirror set https://google.golang.org/genproto/protobuf/field_mask https://github.com/google/go-genproto/tree/master/protobuf/field_mask --vcs git
$ glide init
$ glide install
$ glide up
镜像相关:
#清理缓存,缓存位置$HOME/.glide/cache/src
glide cc
#设置镜像,镜像映射文件 $HOME/.glide/mirrors.yaml
glide mirror set [original] [replacement]
glide mirror set [original] [replacement] --vcs [type]
#移除镜像
glide mirror remove [original]
ubuntu配置golang开发环境
pilot@ubuntu:~$sudo apt install golang-go
pilot@ubuntu:~$mkdir gopath
pilot@ubuntu:~$ mkdir gopath/src
pilot@ubuntu:~$ mkdir gopath/pkg
pilot@ubuntu:~$ mkdir gopath/bin
#添加gopath路径到/etc/profile,添加如下两行到/ete/profile
export GOPATH=/home/pilot/gopath
export PATH=$PATH:$GOPATH/bin
golang静态检查goreporter
$pwd
$/gopath/src
$go get -u github.com/360EntSecGroup-Skylar/goreporter
$ls /gopath/bin
goreporter
$ls /gopath/src
golang-helloworld
$cd /gopath/src
#goreporter -p [projectRelativePath] -r [reportPath] -e [exceptPackagesName] -f [json/html/text] {-t templatePathIfHtml}
#扫描的时候忽略deps目录,产生的报告
$../bin/goreporter.exe -p ./golang-helloworld/ -r ./ -e deps -f html
References