Skip to content

maidol/go-learning

Repository files navigation

go-learning


查看文档


  • 使用命令

go doc time # 包名
go doc time.Since # 包成员(函数, 变量, 类型 ...)
go doc time.Duration.Seconds # 包成员的方法
  • 线上godoc.org/gowalker.org

  • 使用本地godoc, localhost:8000

godoc -http :8000
  • 查看包元数据 go list

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
  • 监控代码变化自动重启 gin fresh

  • 安装
go get github.com/codegangsta/gin
  • 运行
gin -p 3000 -a 8080 # -p 代理端口, -a web程序端口, 访问 localhost:3000 => localhost:8080
  • 使用go get安装依赖

go get # 为GOPATH管理代码
  • 构建/安装

go build
go install
  • 代码启动

go run main.go
  • 测试 go test

示例代码目录
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
$ 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示例函数将是包文档的一部分

持续集成, travis, ci


记录


go get 需要http代理, shadowsocks使用的是socks5代理, 需要添加http代理在shadowsocks的前端, 而shadowsocks作为二级代理。go get 下载package时, 第一步go get先根据包名获取真正的代码下载地址, 再使用版本控制软件下载代码, 最后go安装。这里的http代理涉及到两个, 一个是go get使用的代理, 另一个是版本控制软件使用的代理, 需分别设置
# 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'
# 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"
  • vscode插件

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 会为新编译的包目录添加一个后缀,这样可以把编译的输出与默认的路径分离。

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published