Go语言学习06~07 错误处理和包管理

Go语言学习06-错误处理

Go的错误机制

与其他主要编程语言的差异

  1. 没有异常机制

  2. error类型实现了error接口

  3. 可以通过 errors.New 来快速创建错误实例

    go 复制代码
    type error interface {
        Error() string
    }
    
    errors.New("n must be in range [0, 10]")

最佳实践

定义不同的错误变量, 以便于判断错误类型

go 复制代码
var LessThanTwoError = errors.New("n should be not less than 2")
var LargeThanHundredError = errors.New("n should be not larger than 100")

func GetFibonacci(n int) ([]int, error) {
	if n < 2 {
		return nil, LessThanTwoError
	}
	if n > 100 {
		return nil, LargeThanHundredError
	}
	fibList := []int{1, 1}

	for i := 2; i < n; i++ {
		fibList = append(fibList, fibList[i-2]+fibList[i-1])
	}
	return fibList, nil
}
func TestGetFibonacci(t *testing.T) {
	if v, err := GetFibonacci(-10); err != nil {
		if err == LessThanTwoError {
			fmt.Println("It is less.")
		}
		t.Error(err)
	} else {
		t.Log(v)
	}
}

及早失败, 避免嵌套!

panic

  • panic 用于不可恢复的错误
  • panic 退出前会执行 defer 指定的内容
panic vs. os.Exit
  • os.Exit 退出时不会调用 defer 指定的函数
  • os.Exit 退出时不输出当前调用栈信息

recover

go 复制代码
// 最常见的"错误恢复"
defer func() {
	if err := recover(); err != nil {
        Log.Error("recovered panic", err)
	}
}()

缺陷:

  • 形成僵尸服务进程, 导致 health check 失效
  • "Let it Crash!" 往往是我们恢复不确定性错误的最好方法


Go语言学习07-包和依赖管理

package

  1. 基本复用模块单元

    以首字母大写来表明可被包外代码访问

  2. 代码的 package 可以和所在的目录不一致

  3. 同一目录里的 Go 代码的 package 要保持一致


  1. 通过 go get 来获取远程依赖

    go get -u 强制从网络更新远程依赖

  2. 注意代码在 GitHub 上的组织形式, 以适应 go get

    直接以代码路径开始, 不要有 src

init 方法

  • 在 main 被执行前, 所有依赖的 package 的 init 方法都会被执行
  • 不同包的 init 函数按照包导入的依赖关系决定执行顺序
  • 每个包可以有多个init函数
  • 包的每个源文件也可以有多个init函数, 这点比较特殊

Go 未解决的依赖问题

  1. 统一环境下, 不同项目使用同一包的不同版本
  2. 无法管理对包的特定版本的依赖

vendor 路径

随着Go 1.5 release 版本的发布, vendor目录被添加到除了GOPATHGOROOT之外的依赖目录查找的解决方案。在Go 1.6之前,你需要手动的设置环境变量

查找依赖包路径的解决方案如下:

  1. 当前包下的 vendor 目录
  2. 向上级目录查找, 知道找到 src 下的 vendor 目录
  3. 在 GOPATH 下面查找依赖包
  4. 在 GOROOT 目录下查找

常用的依赖管理工具

godep https://github.com/tools/godep

glide https://github.com/Masterminds/glide

dep https://github.com/golang/dep

相关推荐
爱好学习的青年人7 小时前
一文详解Go语言字符串
开发语言·后端·golang
思考的笛卡尔12 小时前
Go语言实战:高并发服务器设计与实现
服务器·开发语言·golang
会跑的葫芦怪1 天前
Go语言操作Redis
开发语言·redis·golang
静谧之心2 天前
在 K8s 上可靠运行 PD 分离推理:RBG 的设计与实现
云原生·容器·golang·kubernetes·开源·pd分离
赴前尘2 天前
Go 微服务框架排行榜(按 GitHub Star 排序)
微服务·golang·github
自学AI的鲨鱼儿3 天前
ubuntu22.04安装gvm管理go
开发语言·后端·golang
数据知道3 天前
Go基础:正则表达式 regexp 库详解
开发语言·mysql·golang·正则表达式·go语言
Paul_09203 天前
golang面经——内存相关模块
服务器·网络·golang
gopyer3 天前
180课时吃透Go语言游戏后端开发6:Go语言的循环语句
开发语言·游戏·golang·循环语句