20、错误处理 (下)

你好,我是郝林,今天我们继续来分享错误处理。 在上一篇文章中,我们主要讨论的是从使用者的角度看“怎样处理好错误值”。那么,接下来我们需要关注的,就是站在建造者的角度,去关心“怎样才能给予使用者恰当的错误值”的问题了。 知识扩展问题:怎样根据实际情况给...

Go语言核心36讲

21、panic函数、recover函数以及defer语句 (上)

我在上两篇文章中,详细地讲述了Go语言中的错误处理,并从两个视角为你总结了错误类型、错误值的处理技巧和设计方式。 在本篇,我要给你展示Go语言的另外一种错误处理方式。不过,严格来说,它处理的不是错误,而是异常,并且是一种在我们意料之外的程序异常。 前...

Go语言核心36讲

22、panic函数、recover函数以及defer语句(下)

你好,我是郝林,今天我们继续来聊聊panic函数、recover函数以及defer语句的内容。 我在前一篇文章提到过这样一个说法,panic之中可以包含一个值,用于简要解释引发此panic的原因。 如果一个panic是我们在无意间引发的,那么其中的值...

Go语言核心36讲

23、测试的基本规则和流程 (上)

你好,我是郝林,今天我分享的主题是:测试的基本规则和流程(上)。 你很棒,已经学完了本专栏最大的一个模块!这涉及了Go语言的所有内建数据类型,以及非常有特色的那些流程和语句。 你已经完全可以去独立编写各种各样的Go程序了。如果忘了什么,回到之前的文章...

Go语言核心36讲

24、测试的基本规则和流程(下)

你好,我是郝林。今天我分享的主题是测试的基本规则和流程的(下)篇。 Go语言是一门很重视程序测试的编程语言,所以在上一篇中,我与你再三强调了程序测试的重要性,同时,也介绍了关于go test命令的基本规则和主要流程的内容。今天我们继续分享测试的基本规...

Go语言核心36讲

25、更多的测试手法

在前面的文章中,我们一起学习了Go程序测试的基础知识和基本测试手法。这主要包括了Go程序测试的基本规则和主要流程、testing.T类型和testing.B类型的常用方法、go test命令的基本使用方式、常规测试结果的解读等等。 在本篇文章,我会继...

Go语言核心36讲

26、sync.Mutex与sync.RWMutex

我在前面用20多篇文章,为你详细地剖析了Go语言本身的一些东西,这包括了基础概念、重要语法、高级数据类型、特色语句、测试方案等等。 这些都是Go语言为我们提供的最核心的技术。我想,这已经足够让你对Go语言有一个比较深刻的理解了。 从本篇文章开始,我们...

Go语言核心36讲

27、条件变量sync.Cond (上)

在上篇文章中,我们主要说的是互斥锁,今天我和你来聊一聊条件变量(conditional variable)。 前导内容:条件变量与互斥锁我们常常会把条件变量这个同步工具拿来与互斥锁一起讨论。实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥...

Go语言核心36讲

28、条件变量sync.Cond (下)

你好,我是郝林,今天我继续分享条件变量sync.Cond的内容。我们紧接着上一篇的内容进行知识扩展。 问题 1:条件变量的Wait方法做了什么?在了解了条件变量的使用方式之后,你可能会有这么几个疑问。 为什么先要锁定条件变量基于的互斥锁,才能调用它...

Go语言核心36讲

29、原子操作(上)

我们在前两篇文章中讨论了互斥锁、读写锁以及基于它们的条件变量,先来总结一下。 互斥锁是一个很有用的同步工具,它可以保证每一时刻进入临界区的goroutine只有一个。读写锁对共享资源的写操作和读操作则区别看待,并消除了读操作之间的互斥。 条件变量主要...

Go语言核心36讲