go doc time # 包名
go doc time.Since # 包成员(函数, 变量, 类型 ...)
go doc time.Duration.Seconds # 包成员的方法
godoc -http :8000
go list -json time # 包名
依赖管理工具, dep 为应用管理代码, dep教程github: dep
- 设置环境变量
# 设置环境变量 使用vendor目录
GO15VENDOREXPERIMENT=1
- 安装
go get -u github.com/golang/dep/cmd/dep
- 初始化项目
mkdir sample
cd sample
# Gopkg.lock, Gopkg.toml, vender
dep init
dep init -v #
- 安装依赖
dep ensure #
dep ensure -update
dep ensure -add github.com/pkg/errors
- 安装
go get github.com/codegangsta/gin
- 运行
gin -p 3000 -a 8080 # -p 代理端口, -a web程序端口, 访问 localhost:3000 => localhost:8080
go get # 为GOPATH管理代码
go build
go install
go run main.go
示例代码目录
go-learning/word1
go-learning/echo
- 运行测试
go test
go test -run=${regx} # ${regx} 指定测试符合正则的测试函数
- 运行测试并统计覆盖率
go test -cover
- 运行测试并生成覆盖率报告
go test -coverprofile=c.out # 只统计代码是否被运行过
go test -coverprofile=c.out -covermode=count # -covermode=count 统计代码的运行权重
- 查看覆盖率报告
go tool cover -html=c.out
不应该过度纠结于细节的优化,应该说约97%的场景:过早的优化是万恶之源。仅当关键代码已经被确认的前提下才会进行优化
示例代码目录
go-learning/word1
- 运行
go test -bench=.
go test -bench=. -benchmem # -benchmem 内存分配情况, 频繁的内存分配会影响性能
- 性能剖析
$ go test -cpuprofile=cpu.out
$ go test -blockprofile=block.out
$ go test -memprofile=mem.out
- 剖析net/http, 参考
$ go test -run=NONE -bench=ClientServerParallelTLS64 \
-cpuprofile=cpu.log net/http
$ go tool pprof -text -nodecount=10 ./http.test cpu.log
根据示例函数的后缀名部分,godoc这个web文档服务器会将示例函数关联到某个具体函数或包本身,因此ExampleIsPalindrome示例函数将是IsPalindrome函数文档的一部分,Example示例函数将是包文档的一部分
go get 需要http代理, shadowsocks使用的是socks5代理, 需要添加http代理在shadowsocks的前端, 而shadowsocks作为二级代理。go get 下载package时, 第一步go get先根据包名获取真正的代码下载地址, 再使用版本控制软件下载代码, 最后go安装。这里的http代理涉及到两个, 一个是go get使用的代理, 另一个是版本控制软件使用的代理, 需分别设置
- 安装并设置http代理cow
- 设置版本控制软件的http代理git mercurial svn 相关问题
- 设置go get的http代理 相关问题
- ps: go 1.12版本之后支持go modules和GOPROXY特性,只要开启go modules就可以使用GOPROXY特性,设置GOPROXY=https://goproxy.io 或 GOPROXY=https://athens.azurefd.net 环境变量也可解决代理问题
# for linux
#You can set these environment variables in your bash_profile, but if you want to limit their usage to go, you can run it like this:
$ http_proxy=127.0.0.1:7777 go get -u -v code.google.com/p/go.crypto/bcrypt
# for linux
#If that's what you always want, set this alias to avoid typing proxy part every time:
$ alias go='http_proxy=127.0.0.1:7777 go'
- 设置http_proxy/https_proxy环境变量 go get使用的代理
# powershell
$env:http_proxy="http://127.0.0.1:7777"
$env:https_proxy="http://127.0.0.1:7777"
# cmd
set http_proxy="http://127.0.0.1:7777"
set https_proxy="http://127.0.0.1:7777"
# bash
export http_proxy="http://127.0.0.1:7777"
export https_proxy="http://127.0.0.1:7777"
Beautify/.jshintrc Genertor/Docker/Document This/EditorConfig/ESLint/ftp-sync/Git History/Git Merger/Git Project Manager/Go/HTML Snippets/jshint/mdeiawiki/nginx.conf/TODO Highlight/TODO Parser/vscode-icons/markdownlint
使用Go来构建微服务的一个优点是,它会被编译成二进制包,这样的话,它就不需要框架或者运行依赖,这样非常有利,因为正如前面所说Alpine是一个非常轻量级的分发版,并不是所有C语言依赖库都有安装,所以Go的动态库依赖很可能也没有。所幸的是有专门的方法去禁用了cgo依赖,可以把应用通过链接的方式编译,我们只需要这样告诉编译器去重新构建我们的所有应用包就可以了:
$ CGO_ENABLED=0 go build -a -installsuffix cgo .
我们更详细说一下上边这个命令的细节: CGO_ENABLED=0 是一个编译标志,会让构建系统忽略cgo并且静态链接所有依赖; -a 会强制重新编译,即使所有包都是由最新代码编译的; -installsuffix cgo 会为新编译的包目录添加一个后缀,这样可以把编译的输出与默认的路径分离。