代码演示

package main

import (
"errors"
"fmt"
) // Go语言里面约定错误代码是函数的最后一个返回值,
// 并且类型是error,这是一个内置的接口
func f1(arg int) (int, error) {
if arg == 42 { // errors.New使用错误信息作为参数,构建一个基本的错误
return -1, errors.New("cant't work with 42")
} // 返回错误为nil表示没有错误
return arg + 3, nil
} // 你可以通过实现error接口的方法Error()来自定义错误
// 下面我们自定义一个错误类型来表示上面例子中的参数错误
type argError struct {
arg int
prob string
} func (e *argError) Error() string {
return fmt.Sprintf("%d - %s", e.arg, e.prob)
} func f2(arg int) (int, error) {
if arg == 42 { // 这里我们使用&argError语法来创建一个新的结构体对象,
// 并且给它的成员赋值
return -1, &argError{arg, "can't work with it"}
} return arg + 3, nil
} func main() { // 下面的两个循环例子用来测试我们的带有错误返回值的函数
// 在for循环语句里面,使用了if来判断函数返回值是否为nil是
// Go语言里面的一种约定做法。
for _, i := range []int{7, 42} {
if r, e := f1(i); e != nil {
fmt.Println("f1 failed:", e)
} else {
fmt.Println("f1 worked:", r)
}
} for _, i := range []int{7, 42} {
if r, e := f2(i); e != nil {
fmt.Println("f2 failed:", e)
} else {
fmt.Println("f2 worked:", r)
}
} // 如果你需要使用自定义错误类型返回的错误数据,你需要使用类型断言
// 来获得一个自定义错误类型的实例才行。
_, e := f2(42)
if ae, ok := e.(*argError); ok {
fmt.Println(ae.arg)
fmt.Println(ae.prob)
}
}

代码运行结果

f1 worked: 10

f1 failed: cant't work with 42

f2 worked: 10

f2 failed: 42 - can't work with it

42

can't work with it

代码解读:

  • 错误一般是最后一个返回值,并且是一个内建的接口,是error类型
  • 可以用errors.New构造一个使用给定的错误信息的error值
  • 如果没有错误值的话,返回用nil表示

最新文章

  1. HDU--最小路
  2. 总结Themida / Winlicense加壳软件的脱壳方法
  3. codeforces 723B:Text Document Analysis
  4. 解决ArcGIS API for Silverlight 加载地图的内外网访问问题
  5. opencv实现图片缩放
  6. 怒刷DP之 HDU 1176
  7. spring 与 CXF 整合 webservice 出现error “Unable to locate Spring NamespaceHandler for XML schema namespace” 总结
  8. mysql中的unique
  9. [国嵌攻略][106][Linux内存管理子系统]
  10. iOS通知传值的使用
  11. openlayers4 入门开发系列之地图展示篇(附源码下载)
  12. java设计模式:面向对象设计的7个原则
  13. git 生成ssh keys
  14. Java设计模式之十一种行为型模式(附实例和详解)
  15. Jquery实现$.fn.extend和$.extend函数
  16. [二十一]SpringBoot 之 导入xml配置
  17. Java 对比Hashtable、Hashmap、Treemap有什么不同?
  18. 使用zabbix监控mysql
  19. jdk collections map类图
  20. JavaScript原型模式(prototype)

热门文章

  1. C#联合WINCC之数据通信
  2. redis(五):Redis 键(key)(python)
  3. bzoj3381[Usaco2004 Open]Cave Cows 2 洞穴里的牛之二*
  4. C++ 深搜调错
  5. CSS栅格布局
  6. 高效C++:模板和泛型编程
  7. P4547 [THUWC2017]随机二分图(状压,期望DP)
  8. 数字货币交易所(火币为例)如何使用二次验证码/虚拟MFA/两步验证/谷歌验证器?
  9. Unity 基于excel2json批处理读取Excel表并反序列化
  10. Markdown画图(mermaid)学习