Go Advanced
Golang 是一门编译语言,需要像 C++ 那样先编译再运行,而无法像 Python 那样直接运行
常用命令
go version # 查看当前 Go 版本go env # 查看当前 Go 环境变量 (包含 GOROOT GOPATH PROXY等等配置)go env -w GOPROXY=https://goproxy.cn,direct # -w 以写的方式修改 Go 的环境变量go build main.go # 编译 main.go 文件 生成可运行文件 maingo run main.go # 直接运行 main.go 文件 而不生成 main 可运行文件go get # 下载指定依赖包go mod tidy # 按照 go.mod 文件中的依赖关系下载依赖包
逃逸分析
堆内存:向上(高地址)增长的、非连续的、效率较低的、空间较大的内存存储空间
栈内存:向下(低地址)增长的、连续的、效率高的、空间较小的内存存储空间(符合数据结构中栈的特点)
由此可见,为了性能和效率考虑,我们应该尽可能地在栈上分配内存,也就是说除了某些特殊情况外,其余基本都是在栈上分配内存
分配在堆上(逃逸)的情况
- 编译期无法确定变量类型
- 变量在函数闭包外存在外部引用
- 变量大小过大
单元测试
我们需要原文件、测试文件、go test
命令
这里假设原文件为 main.go
,则测试文件需要被命名为 main_test.go
package main
import ( "testing")
func TestMain(t *testing.T) { testcases := []struct { name string age int }{ {"zari", 18}, {""}, {"tsu", -1} } for _, tc := range testcases { // 具体的测试逻辑 }}
执行测试用例的命令都是基于 go test
命令的
go test # 运行该package下的所有测试用例go test -v # 运行该package下的所有测试用例并显示详细信息go test -run TestMain # 运行某个特定的测试用例