目录
本文内容选自:github: Go学习之路(入门教程集合)
1. 10min语法速学
不想粘贴教程,但初学真的记不住,来回查找还不如先集中在一起。熟练了再删掉……
1.1. 错误机制
error 往往是能预知的错误,但是也可能出现一些不可预知的错误,例如数组越界,这种错误可能会导致程序非正常退出,在 Go 语言中称之为 panic。
在 Python、Java 等语言中有 try...catch 机制,在 try 中捕获各种类型的异常,在 catch 中定义异常处理的行为。Go 语言也提供了类似的机制 defer 和 recover。
func get(index int) (ret int) {
defer func() {
if r := recover(); r != nil {
fmt.Println("Some error happened!", r)
ret = -1
}
}()
arr := [3]int{2, 3, 4}
return arr[index]
}
func main() {
fmt.Println(get(5))
fmt.Println("finished")
}
在 get 函数中,使用 defer 定义了异常处理的函数,在协程退出前,会执行完 defer 挂载的任务。因此如果触发了panic,控制权就交给了defer。
$ go run .
Some error happened! runtime error: index out of range [5] with length 3
-1
finished
在 defer 的处理逻辑中,使用 recover 使程序恢复正常,并且将返回值设置为 -1,在这里也可以不处理返回值,如果不处理返回值,返回值将被置为默认值 0。
panic 的一种常见用法是:当函数返回我们不知道如何处理(或不想处理)的错误值时,中止操作。 如果创建新文件时遇到意外错误该如何处理?这里有一个很好的 panic 示例。
func main() {
panic("a problem")
_, err := os.Create("/tmp/file")
if err != nil {
panic(err)
}
}
Defer 用于确保程序在执行完成后,会调用某个函数,一般是执行清理工作。
func main() {
f := createFile("/tmp/defer.txt")
defer closeFile(f)
writeFile(f)
}
在 createFile 后立即得到一个文件对象, 我们使用 defer 通过 closeFile 来关闭这个文件。 这会在封闭函数(main)结束时执行,即 writeFile 完成以后。
1.1.1. 总结
实际上,Golang如此的处理,继承自Google对C++的编程规范——不允许使用 Exception 机制。
Exception有如下特性:
- 相比errcode, 具有明确的语义
- try...catch... 可以实现代码跨层级跳转
- 通过Exception类继承,可以使用基类捕获不明确的错误类型
而Golang,由于不允许跳转,所以未实现try模式。panic则是作为第三个目的而实现的。
2. 常用命令
- go run xxx.go
- go build xxx.go
- go get
- go install
- gofmt
- gRPC
3. Go Modules & goproxy.cn
3.1. goproxy.cn
从 Go 1.11 版本开始,Go 提供了 Go Modules 的机制,推荐设置以下环境变量,第三方包的下载将通过国内镜像,避免出现官方网址被屏蔽的问题。
$ go env -w GOPROXY=https://goproxy.cn,direct
或在 ~/.profile 中设置环境变量
export GOPROXY=https://goproxy.cn
3.2. "module" != "package"
有一点需要纠正,就是“模块”和“包”,也就是 “module” 和 “package” 这两个术语并不是等价的,是 “集合” 跟 “元素” 的关系,“模块” 包含 “包”,“包” 属于 “模块”,一个 “模块” 是零个、一个或多个 “包” 的集合。
4. 进阶
- GO语言关键特性
- 并发与协程
- 基于消息传递的通信方式
- 丰富实用的内置数据类型
- 函数多返回值
- Defer延迟处理机制
- 反射(reflect)
- 高性能HTTP Server
- 工程管理
- 编程规范
- API框架的实现
- 公共组件能力
- 通用列表组件
- 通用表单组件
- 协程池
- 数据校验
5. 标准库
- 官方文档
-
中文解析
- time
- sync
- fmt
- strconv
- errors
- container
- path
- net/http
- net/http/httptest
- database/sql
- encoding/json
- ioutil.ReadFile
- os.Open
- fp.Read
- io.ReadAtLeast
- bufio
- NewReader
- ReadLine
- bytes
- reflect
- context
- flag - 命令行参数解析