Golang学习 - errors 包

------------------------------------------------------------

  Go 语言使用 error 类型来返回函数执行过程中遇到的错误,如果返回的 error 值为 nil,则表示未遇到错误,否则 error 会返回一个字符串,用于说明遇到了什么错误。

其实 error 只是一个接口,定义如下:

------------------------------------------------------------

type error interface {
	Error() string
}

------------------------------------------------------------

  你可以用任何类型去实现它(只要添加一个 Error() 方法即可),也就是说,error 可以是任何类型,这意味着,函数返回的 error 值实际可以包含任意信息,不一定是字符串(当然字符串是必须的)。

  error 不一定表示一个错误,它可以表示任何信息,比如 io 包中就用 error 类型的 io.EOF 表示数据读取结束,而不是遇到了什么错误。再比如 path/filepath 包中用 error 类型的 filepath.SkipDir 表示跳过当前目录,继续遍历下一个目录,而不是遇到了什么错误。

  errors 包实现了一个最简单的 error 类型,只包含一个字符串,它可以记录大多数情况下遇到的错误信息。errors 包的用法也很简单,只有一个 New 函数,用于生成一个最简单的 error 对象:

------------------------------------------------------------

// 将字符串 text 包装成一个 error 对象返回
New(text string) error

------------------------------------------------------------

// 示例
func SomeFunc() error {
	if 遇到错误 {
		return errors.New("遇到了某某错误")
	}
	return nil
}

------------------------------------------------------------

  如果你的程序需要记录更多的错误信息,比如时间、数值等信息,可以声明一个自定义的 error 类型。

------------------------------------------------------------

// 示例
package main

import (
	"fmt"
	"time"
)

type myError struct {
	err   string
	time  time.Time
	count int
}

func (m *myError) Error() string {
	return fmt.Sprintf("%s %d 次。时间:%v", m.err, m.count, m.time)
}

func newErr(s string, i int) *myError {
	return &myError{
		err:   s,
		time:  time.Now(),
		count: i,
	}
}

var count int

func SomeFunc() error {
	if true {
		count++
		return newErr("遇到某某情况", count)
	}
	return nil
}

func main() {
	for i := 0; i < 5; i++ {
		if err := SomeFunc(); err != nil {
			fmt.Println(err)
		}
	}
}

------------------------------------------------------------
时间: 2024-07-28 15:54:20

Golang学习 - errors 包的相关文章

Golang学习 - builtin 包

Go builtin包提供了go预先声明的函数.变量等的文档.这些函数变量等的实现其实并不是在builtin包里,只是为了方便文档组织. 这些内置的变量.函数.类型无需引入包即可使用. 默认提供的有: 1.常量: true,false,iota 关于iota,请参考周一的文章"go iota用法" 2.变量 nil 3.函数 func append(slice []Type, elems ...Type) []Type 向slice中添加元素 func cap(v Type) int

Golang学习 - strconv 包--数据类型转换

// 将布尔值转换为字符串 true 或 false func FormatBool(b bool) string // 将字符串转换为布尔值 // 它接受真值:1, t, T, TRUE, true, True // 它接受假值:0, f, F, FALSE, false, False // 其它任何值都返回一个错误. func ParseBool(str string) (bool, error) ------------------------------ // ErrRange 表示值超

Golang学习 - unsafe 包

------------------------------------------------------------ 指针类型: *类型:普通指针,用于传递对象地址,不能进行指针运算. unsafe.Pointer:通用指针类型,用于转换不同类型的指针,不能进行指针运算. uintptr:用于指针运算,GC 不把 uintptr 当指针,uintptr 无法持有对象.uintptr 类型的目标会被回收. unsafe.Pointer 可以和 普通指针 进行相互转换. unsafe.Point

Golang学习 - sync 包

------------------------------------------------------------ 临时对象池 Pool 用于存储临时对象,它将使用完毕的对象存入对象池中,在需要的时候取出来重复使用,目的是为了避免重复创建相同的对象造成 GC 负担过重.其中存放的临时对象随时可能被 GC 回收掉(如果该对象不再被其它变量引用). 从 Pool 中取出对象时,如果 Pool 中没有对象,将返回 nil,但是如果给 Pool.New 字段指定了一个函数的话,Pool 将使用该函

Golang学习 - regexp 包

// 函数 // 判断在 b(s.r)中能否找到 pattern 所匹配的字符串 func Match(pattern string, b []byte) (matched bool, err error) func MatchString(pattern string, s string) (matched bool, err error) func MatchReader(pattern string, r io.RuneReader) (matched bool, err error) /

Golang学习笔记--log包

个人站:http://www.cloudnoter.com/?p=137 一.快速使用 Golang的log包短小精悍,可以非常轻松的实现日志打印转存功能.不用多说,log支持并发操作(即协程安全-相对于JAVA中的线程安全而言),其结构定义如下: type Logger struct { mu sync.Mutex // ensures atomic writes; protects the following fields prefix string // prefix to write a

Golang学习--包管理工具glide

上一篇文章中我们已经成功的运行了go的代码,这是我们迈出的最基础的一步. 一个项目通常会依赖很多外部的库,当依赖的库比较多的时候,手工管理就会比较麻烦,这个时候就需要包管理工具出场了,帮你管理好所有依赖的库. php项目中使用composer,javascript项目中使用npm,那么在go项目中,我们需要使用什么? 包依赖工具的选择 当前go的包管理工具有glide.godep.govendor和gvt等,相关对比的文章可以查看<go依赖包管理工具对比>. 功能对比可以参考如下内容(虽然跟上

【golang学习】环境搭建

近期项目的需要开始了学习golang的旅程,在此将学习的过程做以记录,方便查看,也希望帮助到大家. 由于我使用的是64位linux环境(redhat 5.2),所以这里就介绍64位的安装方式,其他类似: 1. 下载安装包 自从2014年5月谷歌在国内被封杀之后,我们下载go安装包也得翻墙了,但是为了方便我上传了一个64位linux的包在(地址),你可以直接下载使用. 2.安装 下载完上传到你的linux系统中,比如/opt/go1.1.1.linux-amd64.tar.gz,这是就开始安装了,

golang的io包

package io import "io" io包提供了对I/O原语的基本接口.本包的基本任务是包装这些原语已有的实现(如os包里的原语),使之成为共享的公共接口,这些公共接口抽象出了泛用的函数并附加了一些相关的原语的操作. 因为这些接口和原语是对底层实现完全不同的低水平操作的包装,除非得到其它方面的通知,客户端不应假设它们是并发执行安全的. Index Variables type Reader type Writer type Closer type Seeker type Re