Go语言核心36讲
郝林
《Go并发编程实战》作者,前轻松筹大数据负责人
立即订阅
24139 人已学习
课程目录
已完结 54 讲
0/4登录后,你可以任选4讲全文学习。
开篇词+学习路线 (3讲)
开篇词 | 跟着学,你也能成为Go语言高手
免费
预习篇 | 写给0基础入门的Go语言学习者
50 | 学习专栏的正确姿势
模块一:Go语言基础知识 (6讲)
01 | 工作区和GOPATH
02 | 命令源码文件
03 | 库源码文件
04 | 程序实体的那些事儿(上)
05 | 程序实体的那些事儿(中)
06 | 程序实体的那些事儿 (下)
模块二:Go语言进阶技术 (16讲)
07 | 数组和切片
08 | container包中的那些容器
09 | 字典的操作和约束
10 | 通道的基本操作
11 | 通道的高级玩法
12 | 使用函数的正确姿势
13 | 结构体及其方法的使用法门
14 | 接口类型的合理运用
15 | 关于指针的有限操作
16 | go语句及其执行规则(上)
17 | go语句及其执行规则(下)
18 | if语句、for语句和switch语句
19 | 错误处理(上)
20 | 错误处理 (下)
21 | panic函数、recover函数以及defer语句 (上)
22 | panic函数、recover函数以及defer语句(下)
模块三:Go语言实战与应用 (27讲)
23 | 测试的基本规则和流程 (上)
24 | 测试的基本规则和流程(下)
25 | 更多的测试手法
26 | sync.Mutex与sync.RWMutex
27 | 条件变量sync.Cond (上)
28 | 条件变量sync.Cond (下)
29 | 原子操作(上)
30 | 原子操作(下)
31 | sync.WaitGroup和sync.Once
32 | context.Context类型
33 | 临时对象池sync.Pool
34 | 并发安全字典sync.Map (上)
35 | 并发安全字典sync.Map (下)
36 | unicode与字符编码
37 | strings包与字符串操作
38 | bytes包与字节串操作(上)
39 | bytes包与字节串操作(下)
40 | io包中的接口和工具 (上)
41 | io包中的接口和工具 (下)
42 | bufio包中的数据类型 (上)
43 | bufio包中的数据类型(下)
44 | 使用os包中的API (上)
45 | 使用os包中的API (下)
46 | 访问网络服务
47 | 基于HTTP协议的网络服务
48 | 程序性能分析基础(上)
49 | 程序性能分析基础(下)
尾声与思考题答案 (2讲)
尾声 | 愿你披荆斩棘,所向无敌
新年彩蛋 | 完整版思考题答案
Go语言核心36讲
登录|注册

19 | 错误处理(上)

郝林 2018-09-24
提到 Go 语言中的错误处理,我们其实已经在前面接触过几次了。
比如,我们声明过error类型的变量err,也调用过errors包中的New函数。今天,我会用这篇文章为你梳理 Go 语言错误处理的相关知识,同时提出一些关键问题并与你一起探讨。
我们说过error类型其实是一个接口类型,也是一个 Go 语言的内建类型。在这个接口类型的声明中只包含了一个方法ErrorError方法不接受任何参数,但是会返回一个string类型的结果。它的作用是返回错误信息的字符串表示形式。
我们使用error类型的方式通常是,在函数声明的结果列表的最后,声明一个该类型的结果,同时在调用这个函数之后,先判断它返回的最后一个结果值是否“不为nil”。
如果这个值“不为nil”,那么就进入错误处理流程,否则就继续进行正常的流程。下面是一个例子,代码在 demo44.go 文件中。
package main
import (
"errors"
"fmt"
)
func echo(request string) (response string, err error) {
if request == "" {
err = errors.New("empty request")
return
}
response = fmt.Sprintf("echo: %s", request)
return
}
func main() {
for _, req := range []string{"", "hello!"} {
fmt.Printf("request: %s\n", req)
resp, err := echo(req)
if err != nil {
fmt.Printf("error: %s\n", err)
continue
}
fmt.Printf("response: %s\n", resp)
}
}
我们先看echo函数的声明。echo函数接受一个string类型的参数request,并会返回两个结果。
这两个结果都是有名称的,第一个结果response也是string类型的,它代表了这个函数正常执行后的结果值。
第二个结果err就是error类型的,它代表了函数执行出错时的结果值,同时也包含了具体的错误信息。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《Go语言核心36讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(10)

  • zs阿帅
    go2设计草案里提到说对于这种error处理的多个卫术语句的简化,利用check,handler简化错误处理的代码量。
    2018-09-24
    7
  • 那句诺言
    老师,“该值的静态类型当然是error,而动态类型则是一个在errors包中的,包级私有的类型*errorString”,静态类型和动态类型该怎么理解呢?

    作者回复: 我讲接口的时候讲了啊。

    2018-10-30
    3
  • 打卡 已经看了快2/5了 因为之前学过 只是会用 没有这么深入了解过 这次 很多知识点都有新的认识了
    2019-07-27
    1
  • Laughing
    常用到的net和json包中的错误类型有:
    1. AddrError
    2. SyntaxError
    3. MarshalerError
    2018-10-06
    1
  • benying
    评论的人很少了,打卡,20190605
    2019-06-05
  • LH
    未知类型的错误真的感觉不太友好

    作者回复: 其实只是不太随大流而已。try...catch...finally的方式代码量也少不到哪里去。不过Go 2会有大幅改进的。

    2019-03-31
  • 思维
    老师你好,在代码中如何优雅地处理错误呀,有没有办法 不需要在每个方法中处理,集中到一个地方处理?

    作者回复: 基本上是这样,就拿Web系统来说,一般情况下会在系统的最上层(接收request的那一层)统一处理错误。

    2019-03-15
  • 虢国技匠
    打卡
    2019-01-21
  • A 凡
    感觉第一遍看的时候,看的不够仔细,所以从头有看到这部分,发现细节性的东西还是有很多需要注意!
    2018-10-24
  • 有匪君子
    中秋快乐
    2018-09-24
收起评论
10
返回
顶部