Golang - 入门

目录

本文内容选自: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语言最佳实践

  • 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 - 命令行参数解析

6. 第三方库

上一篇:内核crash>>>磁盘空间小 怎么处理


下一篇:go基础4-函数