Golang

 ·  ☕ 8  · 👀...

介绍

技术 特性 适用场景 说明
Go
- 语法简介
- 静态编译语言的安全和性能
- 动态语言开发维护的高效
- 天然高并发
- 多返回值
- 区块链
- 后端服务器应用
- 云计算/云服务后台应用
- 官网
- 下载
- Doc
- 中文文档

配置管理

安装

方法1:homebrew

通过homebrew安装Go

1
2
$ brew update && brew upgrade
$ brew install go

配置环境变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ vi ~/.bash_profile
##### 内容如下 #####
#GOPATH
export GOPATH=$HOME/Documents/Workspace/go

#GOPATH bin
export PATH=$PATH:$GOPATH/bin
##### 内容结束 #####

$ source ~/.bash_profile

方法2:pkg包

直接去官方下载安装包,然后双击安装,之后同样地输入go、go env、go version等查看是否安装。

配置环境变量

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
$ vi ~/.bash_profile
##### 内容如下 #####
#GOROOT
export GOROOT=/usr/local/go

#GOPATH
export GOPATH=$HOME/Documents/Workspace/go

#GOROOT bin
export PATH=$PATH:$GOROOT/bin

#GOPATH bin
export PATH=$PATH:$GOPATH/bin
##### 内容结束 #####

$ source ~/.bash_profile
# 如果用了 iTem2,还需要配置 ~/.zshrc 

检查

1
2
3
4
5
6
# 查看使用帮助
$ go
# 查看环境变量
$ go env
# 查看当前版本
$ go version

升级

1
>  brew upgrade go

配置Visual Studio Code

安装 Go 插件

【Code】-> 【Preferences】-> 【Extensions】-> 搜索 Go -> 安装 -> 重启 Visual Studio Code

配置自动保存

【File】->【Auto Save】

配置代码提示

在 vscode 中,输入快捷键:command(ctrl) + shift + p,在弹出的窗口中,输入:go:install/Update Tools,回车后,选择所有插件(勾一下全选),点击确认,进行安装

接下来,在项目的 settings.json 文件中添加配置:

1
2
3
"go.autocompleteUnimportedPackages": true,
"go.docsTool": "gogetdoc",
"go.formatTool": "goimports",

重启 VSCode。

安装语言工具包

可以实现代码自动补全和自动导包。
【Code】-> 【Preferences】-> 【Settings】-> 搜索 Go -> settings.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
{
    "terminal.integrated.shell.osx": "/bin/zsh",
    "terminal.integrated.fontFamily": "Meslo LG M for Powerline",
    "workbench.startupEditor": "newUntitledFile",
    "files.autoSave": "afterDelay",
    "go.goroot": "",
    "go.gopath": "",
    # 解决自定义包或第三方库无法出现代码提示的问题
    "go.inferGopath": true,
    # 自动完成未导入的包
    "go.autocompleteUnimportedPackages": true,
    "go.gocodePackageLookupMode": "go",
    "go.gotoSymbol.includeImports": true,
    "go.useCodeSnippetsOnFunctionSuggest": true,
    "go.useCodeSnippetsOnFunctionSuggestWithoutType": true,
    # 解决函数无法跳转问题
    "go.docsTool": "gogetdoc",
    # 配置代理
    "http.proxy": "http://127.0.0.1:8001",
}

Command+Shift+P -> Go:Install/Update Tools -> 全选 -> 确定

配置SubLime

SubLime配置Go开发环境

安装Golang build 包

  1. 点击 Preferences > Package control 菜单(MAC快捷键 shift + command + p)
  2. 在弹出的输入框输入install 选择Package control:install package
  3. 然后输入Golang build 选择Golang build 安装

安装好之后点击 Preferences Preferences > Package Setting > Golang Config > Setting - User 设置一些参数

{
    "PATH": "/usr/local/go/bin",
    // 这里改成你自己的GOPATH
    "GOPATH": "$HOME/Documents/Workspace/go"
}

安装GoSublime

  1. 点击 Preferences > Package control 菜单(MAC快捷键 shift + command + p)
  2. 在弹出的输入框输入install 选择Package control:install package
  3. 然后输入GoSublime 选择 GoSublime 安装

安装好之后点击 Preferences Preferences > Package Setting > GoSublime > Setting - Default

"use_gs_gopath": false

改为

"use_gs_gopath": true

Preferences -> package settings -> GoSublime -> Settings - Uesrs

{
    "env": {
        "GOPATH": "$HOME/Documents/Workspace/go",
        "GOROOT": "/usr/local/Cellar/go/1.10.2/libexec"
    }
}

【重启】Sublime。

使用GoSublime

点击 Toos > Build With (Mac 快捷键 shift + command + b)

1
2
3
4
$ go get
$ go install
$ go build
$ go clean

目录结构

目录 说明
GOPATH/bin 存放编译后的二进制文件
GOPATH/pkg 存放编译后的库文件
GOPATH/src 存放源码文件
GOPATH/src/project 适合个人开发者
GOPATH/src/github.com/iamwlb/project 目前流行的项目结构
GOPATH/src/企业域名/xx组/project 企业开发者

基本命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 编译
## 在项目目录下执行
$ go build

## 在非项目目录下执行(path从GOPATH/src/ 后的路径开始写起)
$ go build path -o <输出文件的路径及文件名>

# 像执行脚本一样执行Go代码
$ go run main.go

# 编译并将可执行文件拷贝到 GOPATH/bin
$ go install

# 跨平台编译
## Mac 下编译 Linux 和 Windows平台 64位 可执行程序
$ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

## Linux 下编译 Mac 和 Windows 平台64位可执行程序
$ CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
$ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build

## Windows下编译Mac平台64位可执行程序
$ SET CGO_ENABLED=0
$ SET GOOS=darwin
$ SET GOARCH=amd64
$ go build

# 格式化
$ go fmt main.go

包管理

手动管理

1
> go get -u github.com/xxx.xxx   

dep

dep介绍

dep是一个官方推出的原型依赖管理工具,需要在Go 1.7及更高的版本中使用。

安装

HomeBrew安装

1
2
$ brew install dep
$ brew upgrade dep

Binary Installation

1
$ curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh

Arch Linux

1
$ pacman -S dep

Go get方式安装

1
$ go get -u github.com/golang/dep/cmd/dep

Install From Source

1
2
3
4
5
$ go get -d -u github.com/golang/dep
$ cd $(go env GOPATH)/src/github.com/golang/dep
$ git checkout $DEP_LATEST
$ go install -ldflags="-X main.version=$DEP_LATEST" ./cmd/dep
$ git checkout master

使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#### 验证安装
> dep

#### 初始化
> cd $GOPATH/src/project
> dep init

#### 查看项目依赖
> dep status

#### 确保项目依赖安全
> dep ensure

#### 更新项目依赖
> dep ensure -update
##### 为了更好地看到过程,加上参数-v。

#### 添加项目依赖
> dep ensure -add github.com/pkg/errors
##### 为了更好地看到过程,加上参数-v。

#### 自动管理
> dep prune
#### 执行该命令后,会通过dep ensure来自动管理包依赖。

#### 查看dep版本
> dep version

Go Module

命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
go mod download                             下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit                                 编辑go.mod文件
go mod edit -fmt                            格式化
go mod edit -require=golang.org/x/text      添加依赖项
go mod edit -droprequire=golang.org/x/text  移除依赖项
go mod graph                                打印模块依赖图
go mod init                                 初始化当前文件夹, 创建go.mod文件
go mod tidy                                 增加缺少的module,删除无用的module
go mod vendor                               将依赖复制到vendor下
go mod verify                               校验依赖
go mod why                                  解释为什么需要依赖

go.mod

go.mod文件记录了项目所有的依赖信息,其结构大致如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
module github.com/Q1mi/studygo/blogger

go 1.12

require (
	github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
	github.com/gin-gonic/gin v1.4.0
	github.com/go-sql-driver/mysql v1.4.1
	github.com/jmoiron/sqlx v1.2.0
	github.com/satori/go.uuid v1.2.0
	google.golang.org/appengine v1.6.1 // indirect
)
  • module用来定义包名
  • require用来定义依赖包及版本
  • indirect表示间接引用

已有项目中使用go module

如果需要对一个已经存在的项目启用go module,可以按照以下步骤操作:

  1. 在项目目录下执行go mod init,生成一个go.mod文件。
  2. 执行go get,查找并记录当前项目的依赖,同时生成一个go.sum记录每个依赖库的版本和哈希值。

新项目中使用go module

对于一个新创建的项目,我们可以在项目文件夹下按照以下步骤操作:

  1. 执行go mod init 项目名命令,在当前项目文件夹下创建一个go.mod文件。
  2. 手动编辑go.mod中的require依赖项或执行go get自动发现、维护依赖。

Go Module Proxy

1
2
3
4
5
#### 阿里云Go Module代理仓库服务
> export GOPROXY=https://mirrors.aliyun.com/goproxy/

#### 七牛
export GOPROXY=https://goproxy.cn

测试

测试类型

类型 格式 说明
测试函数 函数名前缀为Test 测试程序的一些逻辑行为是否正确
基准函数 函数名前缀为Benchmark 测试函数的性能
示例函数 函数名前缀为Example 为文档提供示例文档

测试命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
### 运行单元测试
### -v 显示更详细的信息
> go test
### 运行单个文件单元测试
> go test -v hello_test.go
### 运行单个函数单元测试
> go test -v hello_test.go -test.run TestHello

### 查看测试覆盖率
> go test -cover
### 将覆盖率相关的记录信息输出到一个文件
> go test -cover -coverprofile=c.out
### 打开本地的浏览器窗口生成一个HTML报告
> go tool cover -html=c.out

### 执行基准测试(基准测试名字为BenchmarkSplit)
#### -benchmem 获得内存分配的统计数据
#### -benchtime=20s 增加最小基准时间
> go test -bench=Split -benchmem

### 运行示例函数
> go test -run Example

Air

安装

Go

1
> go get -u github.com/cosmtrek/air

Mac

1
> curl -fLo air https://git.io/darwin_air

配置环境变量

1
2
3
4
5
> vim ~/.bash_profile 
##### 添加如下内容 #####
export PATH=$GOPATH/src/github.com/cosmtrek/air/bin/darwin:$##### 内容结束 #####
> source ~/.bash_profile
> air -v

使用

1
2
> cd /path/to/your_project
> air -c .air.conf

完整的air_example.conf示例配置如下:

# [Air](https://github.com/cosmtrek/air) TOML 格式的配置文件

# 工作目录
# 使用 . 或绝对路径,请注意 `tmp_dir` 目录必须在 `root` 目录下
root = "."
tmp_dir = "tmp"

[build]
# 只需要写你平常编译使用的shell命令。你也可以使用 `make`
cmd = "go build -o ./tmp/main ."
# 由`cmd`命令得到的二进制文件名
bin = "tmp/main"
# 自定义的二进制,可以添加额外的编译标识例如添加 GIN_MODE=release
full_bin = "APP_ENV=dev APP_USER=air ./tmp/main"
# 监听以下文件扩展名的文件.
include_ext = ["go", "tpl", "tmpl", "html"]
# 忽略这些文件扩展名或目录
exclude_dir = ["assets", "tmp", "vendor", "frontend/node_modules"]
# 监听以下指定目录的文件
include_dir = []
# 排除以下文件
exclude_file = []
# 如果文件更改过于频繁,则没有必要在每次更改时都触发构建。可以设置触发构建的延迟时间
delay = 1000 # ms
# 发生构建错误时,停止运行旧的二进制文件。
stop_on_error = true
# air的日志文件名,该日志文件放置在你的`tmp_dir`中
log = "air_errors.log"

[log]
# 显示日志时间
time = true

[color]
# 自定义每个部分显示的颜色。如果找不到颜色,使用原始的应用程序日志。
main = "magenta"
watcher = "cyan"
build = "yellow"
runner = "green"

[misc]
# 退出时删除tmp目录
clean_on_exit = true

开源项目

小工具

项目 说明
Air 实时加载

调试

项目 说明
delve a debugger for the Go programming language

Web框架

项目 说明
gin Go世界里最流行的Web框架

ORM框架

项目 说明
gorm 使用Go语言编写的ORM框架

消息队列

项目 说明
NSQ Go语言编写的一个开源的实时分布式内存消息队列
redigo 连接Redis数据库并进行操作,支持连接哨兵及集群模式的Redis
sarama Go语言中连接kafka的第三方库

日志

项目 说明
logrus Go(golang)的结构化logger,与标准库logger完全API兼容
zap 非常快的、结构化的分日志级别的Go日志库

数据库

项目 说明
mongo-go-driver mongoDB官方版的Go驱动包
mysql MySQL驱动

搜索

项目 说明
elastic elastic的第三方库

服务发现

项目 说明
etcd/clientv3 官方的包

监控

项目 说明
gopsutil psutil是一个跨平台进程和系统监控的Python库,而gopsutil是其Go语言版本的实现。

虚拟终端

项目 说明
pty PTY(虚拟终端) interface for Go。开源项目Air

Router

项目 说明
httprouter A high performance HTTP request router that scales well

常见问题

安装 delve

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# 安装Xcode命令行工具
$ xcode-select --install

# 创建证书
## 打开钥匙串访问;
## 菜单栏中选择钥匙串访问-证书助理-创建证书开始创建自签名证书;
## 证书名称设置为dlv-cert(记住这个名字,后面会用到);身份类型选择自签名根证书;证书类型选择代码签名,最后在让我覆盖这些默认值处打上勾,选择继续;
## 在接下来的窗口中把有效期改长一些,例如改成10年(3650天);
## 然后一直往后,直到出现选择指定用于该证书的位置,选择钥匙串系统,然后选择创建;
## 这样证书就创建好了。

$ mkdir -p $GOPATH/src/github.com/derekparker
$ cd $GOPATH/src/github.com/derekparker
$ git clone https://github.com/derekparker/delve.git
$ cd delve
$ CERT=dlv-cert make install

参考


Wanglibing
Wanglibing
Engineer,Lifelong learner