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

相关推荐
GO兔1 小时前
开篇:GORM入门——Go语言的ORM王者
开发语言·后端·golang·go
代码讲故事8 小时前
多种方法实现golang中实现对http的响应内容生成图片
开发语言·chrome·http·golang·图片·快照·截图
weixin_437398219 小时前
转Go学习笔记
linux·服务器·开发语言·后端·架构·golang
Code季风12 小时前
深入比较 Gin 与 Beego:Go Web 框架的两大选择
开发语言·golang·go·gin·beego
Code季风12 小时前
Gin 中间件详解与实践
学习·中间件·golang·go·gin
九班长12 小时前
Golang服务端处理Unity 3D游戏地图与碰撞的详细实现
3d·unity·golang
cui_win1 天前
【基础】Golang语言开发环境搭建(Linux主机)
linux·golang·运维开发
叹一曲当时只道是寻常1 天前
Softhub软件下载站实战开发(十):实现图片视频上传下载接口
golang·go·音视频
qq_168278951 天前
Protobuf在游戏开发中的应用:TypeScript + Golang 实践
服务器·golang·游戏引擎
大模型铲屎官11 天前
【Go语言-Day 7】循环控制全解析:从 for 基础到 for-range 遍历与高级控制
开发语言·人工智能·后端·golang·大模型·go语言·循环控制