摘要:
你好,我是郝林。 在2019年的春节来临之际,我恰好也更新完了专栏所有的配图和思考题答案。希望这些可以帮助到你,在新的一年中,祝你新年快乐,Go语言学习之路更加顺利。 基础概念篇 1. Go语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的? 答:你设置的环境变量GOPATH的值决定了这个顺序。 阅读全文
posted @ 2022-04-01 16:55
易先讯
阅读(170)
评论(0)
推荐(0)
摘要:
你好,我是郝林。 专栏到这里,就要结束了。 差不多在半年以前(2018年的第二个季度),极客时间的总编辑郭蕾找到我,说想让我写一个关于Go语言的技术专栏。 我那时候还在轻松筹担任大数据负责人,管理着四个技术团队,每天都非常非常忙碌,看起来并没有多余的精力去写这么一个在时间和质量上都有着严格要求的专栏 阅读全文
posted @ 2022-04-01 16:53
易先讯
阅读(39)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我们继续分享程序性能分析基础的内容。 在上一篇文章中,我们围绕着“怎样让程序对CPU概要信息进行采样”这一问题进行了探讨,今天,我们再来一起看看它的拓展问题。 知识扩展 问题1:怎样设定内存概要信息的采样频率? 针对内存概要信息的采样会按照一定比例收集Go程序在运行期间的堆内存使 阅读全文
posted @ 2022-04-01 16:52
易先讯
阅读(74)
评论(0)
推荐(0)
摘要:
我们在上一篇文章中简单地讨论了网络编程和socket,并由此提及了Go语言标准库中的syscall代码包和net代码包。 我还重点讲述了net.Dial函数和syscall.Socket函数的参数含义。前者间接地调用了后者,所以正确理解后者,会对用好前者有很大裨益。 之后,我们把视线转移到了net. 阅读全文
posted @ 2022-04-01 16:51
易先讯
阅读(112)
评论(0)
推荐(0)
摘要:
作为拾遗的部分,今天我们来讲讲与Go程序性能分析有关的基础知识。 Go语言为程序开发者们提供了丰富的性能分析API,和非常好用的标准工具。这些API主要存在于: runtime/pprof; net/http/pprof; runtime/trace; 这三个代码包中。 另外,runtime代码包中 阅读全文
posted @ 2022-04-01 16:51
易先讯
阅读(59)
评论(0)
推荐(0)
摘要:
你真的很棒,已经跟着我一起从最开始初识Go语言,一步一步地走到了这里。 在这之前的几十篇文章中,我向你一点一点地介绍了很多Go语言的核心知识,以及一些最最基础的标准库代码包。我想,你已经完全有能力独立去做一些事情了。 为了激发你更多的兴趣,我还打算用几篇文章来说说Go语言的网络编程。不过,关于网络编 阅读全文
posted @ 2022-04-01 16:50
易先讯
阅读(105)
评论(0)
推荐(0)
摘要:
我们今天要讲的是os代码包中的API。这个代码包可以让我们拥有操控计算机操作系统的能力。 前导内容:os包中的API 这个代码包提供的都是平台不相关的API。那么说,什么叫平台不相关的API呢? 它的意思是:这些API基于(或者说抽象自)操作系统,为我们使用操作系统的功能提供高层次的支持,但是,它们 阅读全文
posted @ 2022-04-01 16:48
易先讯
阅读(51)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我们继续分享使用os包中的API。 我们在上一篇文章中。从“os.File类型都实现了哪些io包中的接口”这一问题出发,介绍了一系列的相关内容。今天我们继续围绕这一知识点进行扩展。 知识扩展 问题1:可应用于File值的操作模式都有哪些? 针对File值的操作模式主要有只读模式、 阅读全文
posted @ 2022-04-01 16:48
易先讯
阅读(32)
评论(0)
推荐(0)
摘要:
你好,我是郝林,我今天继续分享bufio包中的数据类型。 在上一篇文章中,我提到了bufio包中的数据类型主要有Reader、Scanner、Writer和ReadWriter。并着重讲到了bufio.Reader类型与bufio.Writer类型,今天,我们继续专注bufio.Reader的内容来 阅读全文
posted @ 2022-04-01 16:47
易先讯
阅读(43)
评论(0)
推荐(0)
摘要:
今天,我们来讲另一个与I/O操作强相关的代码包bufio。bufio是“buffered I/O”的缩写。顾名思义,这个代码包中的程序实体实现的I/O操作都内置了缓冲区。 bufio包中的数据类型主要有: Reader; Scanner; Writer和ReadWriter。 与io包中的数据类型类 阅读全文
posted @ 2022-04-01 16:46
易先讯
阅读(56)
评论(0)
推荐(0)
摘要:
上一篇文章中,我主要讲到了io.Reader的扩展接口和实现类型。当然,io代码包中的核心接口不止io.Reader一个。 我们基于它引出的一条主线,只是io包类型体系中的一部分。我们很有必要再从另一个角度去探索一下,以求对io包有更加全面的了解。 下面的一个问题就与此有关。 知识扩展 问题:io包 阅读全文
posted @ 2022-04-01 16:46
易先讯
阅读(78)
评论(0)
推荐(0)
摘要:
我们在前几篇文章中,主要讨论了strings.Builder、strings.Reader和bytes.Buffer这三个数据类型。 知识回顾 还记得吗?当时我还问过你“它们都实现了哪些接口”。在我们继续讲解io包中的接口和工具之前,我先来解答一下这个问题。 strings.Builder类型主要用 阅读全文
posted @ 2022-04-01 16:45
易先讯
阅读(117)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我们继续分享bytes包与字节串操作的相关内容。 在上一篇文章中,我们分享了bytes.Buffer中已读计数的大致功用,并围绕着这个问题做了解析,下面我们来进行相关的知识扩展。 知识扩展 问题 1:bytes.Buffer的扩容策略是怎样的? Buffer值既可以被手动扩容,也 阅读全文
posted @ 2022-04-01 16:44
易先讯
阅读(35)
评论(0)
推荐(0)
摘要:
我相信,经过上一次的学习,你已经对strings.Builder和strings.Reader这两个类型足够熟悉了。 我上次还建议你去自行查阅strings代码包中的其他程序实体。如果你认真去看了,那么肯定会对我们今天要讨论的bytes代码包,有种似曾相识的感觉。 前导内容: bytes.Buffe 阅读全文
posted @ 2022-04-01 16:43
易先讯
阅读(41)
评论(0)
推荐(0)
摘要:
在上一篇文章中,我介绍了Go语言与Unicode编码规范、UTF-8编码格式的渊源及运用。 Go语言不但拥有可以独立代表Unicode字符的类型rune,而且还有可以对字符串值进行Unicode字符拆分的for语句。 除此之外,标准库中的unicode包及其子包还提供了很多的函数和数据类型,可以帮助 阅读全文
posted @ 2022-04-01 16:42
易先讯
阅读(39)
评论(0)
推荐(0)
摘要:
到目前为止,我们已经一起陆陆续续地学完了Go语言中那些最重要也最有特色的概念、语法和编程方式。我对于它们非常喜爱,简直可以用如数家珍来形容了。 在开始今天的内容之前,我先来做一个简单的总结。 Go语言经典知识总结 基于混合线程的并发编程模型自然不必多说。 在数据类型方面有: 基于底层数组的切片; 用 阅读全文
posted @ 2022-04-01 16:41
易先讯
阅读(35)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我们继续来分享并发安全字典sync.Map的内容。 我们在上一篇文章中谈到了,由于并发安全字典提供的方法涉及的键和值的类型都是interface{},所以我们在调用这些方法的时候,往往还需要对键和值的实际类型进行检查。 这里大致有两个方案。我们上一篇文章中提到了第一种方案,在编码 阅读全文
posted @ 2022-04-01 16:40
易先讯
阅读(30)
评论(0)
推荐(0)
摘要:
在前面,我几乎已经把Go语言自带的同步工具全盘托出了。你是否已经听懂了会用了呢? 无论怎样,我都希望你能够多多练习、多多使用。它们和Go语言独有的并发编程方式并不冲突,相反,配合起来使用,绝对能达到“一加一大于二”的效果。 当然了,至于怎样配合就是一门学问了。我在前面已经讲了不少的方法和技巧,不过, 阅读全文
posted @ 2022-04-01 16:39
易先讯
阅读(55)
评论(0)
推荐(0)
摘要:
到目前为止,我们已经一起学习了Go语言标准库中最重要的那几个同步工具,这包括非常经典的互斥锁、读写锁、条件变量和原子操作,以及Go语言特有的几个同步工具: sync/atomic.Value; sync.Once; sync.WaitGroup context.Context。 今天,我们来讲Go语 阅读全文
posted @ 2022-04-01 15:52
易先讯
阅读(67)
评论(0)
推荐(0)
摘要:
我们在前几次讲的互斥锁、条件变量和原子操作都是最基本重要的同步工具。在Go语言中,除了通道之外,它们也算是最为常用的并发安全工具了。 说到通道,不知道你想过没有,之前在一些场合下里,我们使用通道的方式看起来都似乎有些蹩脚。 比如:声明一个通道,使它的容量与我们手动启用的goroutine的数量相同, 阅读全文
posted @ 2022-04-01 15:47
易先讯
阅读(38)
评论(0)
推荐(0)
摘要:
我们在上篇文章中讲到了sync.WaitGroup类型:一个可以帮我们实现一对多goroutine协作流程的同步工具。 在使用WaitGroup值的时候,我们最好用“先统一Add,再并发Done,最后Wait”的标准模式来构建协作流程。 如果在调用该值的Wait方法的同时,为了增大其计数器的值,而并 阅读全文
posted @ 2022-04-01 15:47
易先讯
阅读(31)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我们继续分享原子操作的内容。 我们接着上一篇文章的内容继续聊,上一篇我们提到了,sync/atomic包中的函数可以做的原子操作有:加法(add)、比较并交换(compare and swap,简称CAS)、加载(load)、存储(store)和交换(swap)。并且以此衍生出了 阅读全文
posted @ 2022-04-01 15:46
易先讯
阅读(47)
评论(0)
推荐(0)
摘要:
我们在前两篇文章中讨论了互斥锁、读写锁以及基于它们的条件变量,先来总结一下。 互斥锁是一个很有用的同步工具,它可以保证每一时刻进入临界区的goroutine只有一个。读写锁对共享资源的写操作和读操作则区别看待,并消除了读操作之间的互斥。 条件变量主要是用于协调想要访问共享资源的那些线程。当共享资源的 阅读全文
posted @ 2022-04-01 15:45
易先讯
阅读(52)
评论(0)
推荐(0)
摘要:
在上篇文章中,我们主要说的是互斥锁,今天我和你来聊一聊条件变量(conditional variable)。 前导内容:条件变量与互斥锁 我们常常会把条件变量这个同步工具拿来与互斥锁一起讨论。实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用。 条件变量并不是被用来保护临界区和共享资源 阅读全文
posted @ 2022-04-01 15:44
易先讯
阅读(52)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我继续分享条件变量sync.Cond的内容。我们紧接着上一篇的内容进行知识扩展。 问题 1:条件变量的Wait方法做了什么? 在了解了条件变量的使用方式之后,你可能会有这么几个疑问。 为什么先要锁定条件变量基于的互斥锁,才能调用它的Wait方法? 为什么要用for语句来包裹调用其 阅读全文
posted @ 2022-04-01 15:44
易先讯
阅读(40)
评论(0)
推荐(0)
摘要:
我在前面用20多篇文章,为你详细地剖析了Go语言本身的一些东西,这包括了基础概念、重要语法、高级数据类型、特色语句、测试方案等等。 这些都是Go语言为我们提供的最核心的技术。我想,这已经足够让你对Go语言有一个比较深刻的理解了。 从本篇文章开始,我们将一起探讨Go语言自带标准库中一些比较核心的代码包 阅读全文
posted @ 2022-04-01 15:43
易先讯
阅读(70)
评论(0)
推荐(0)
摘要:
在前面的文章中,我们一起学习了Go程序测试的基础知识和基本测试手法。这主要包括了Go程序测试的基本规则和主要流程、testing.T类型和testing.B类型的常用方法、go test命令的基本使用方式、常规测试结果的解读等等。 在本篇文章,我会继续为你讲解更多更高级的测试方法。这会涉及testi 阅读全文
posted @ 2022-04-01 15:42
易先讯
阅读(74)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我分享的主题是:测试的基本规则和流程(上)。 你很棒,已经学完了本专栏最大的一个模块!这涉及了Go语言的所有内建数据类型,以及非常有特色的那些流程和语句。 你已经完全可以去独立编写各种各样的Go程序了。如果忘了什么,回到之前的文章再复习一下就好了。 在接下来的日子里,我将带你去学 阅读全文
posted @ 2022-04-01 15:41
易先讯
阅读(48)
评论(0)
推荐(0)
摘要:
你好,我是郝林。今天我分享的主题是测试的基本规则和流程的(下)篇。 Go语言是一门很重视程序测试的编程语言,所以在上一篇中,我与你再三强调了程序测试的重要性,同时,也介绍了关于go test命令的基本规则和主要流程的内容。今天我们继续分享测试的基本规则和流程。本篇代码和指令较多,你可以点击文章查看原 阅读全文
posted @ 2022-04-01 15:41
易先讯
阅读(49)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我们继续来聊聊panic函数、recover函数以及defer语句的内容。 我在前一篇文章提到过这样一个说法,panic之中可以包含一个值,用于简要解释引发此panic的原因。 如果一个panic是我们在无意间引发的,那么其中的值只能由Go语言运行时系统给定。但是,当我们使用pa 阅读全文
posted @ 2022-04-01 14:14
易先讯
阅读(47)
评论(0)
推荐(0)
摘要:
我在上两篇文章中,详细地讲述了Go语言中的错误处理,并从两个视角为你总结了错误类型、错误值的处理技巧和设计方式。 在本篇,我要给你展示Go语言的另外一种错误处理方式。不过,严格来说,它处理的不是错误,而是异常,并且是一种在我们意料之外的程序异常。 前导知识:运行时恐慌panic 这种程序异常被叫做p 阅读全文
posted @ 2022-04-01 14:13
易先讯
阅读(58)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我们继续来分享错误处理。 在上一篇文章中,我们主要讨论的是从使用者的角度看“怎样处理好错误值”。那么,接下来我们需要关注的,就是站在建造者的角度,去关心“怎样才能给予使用者恰当的错误值”的问题了。 知识扩展 问题:怎样根据实际情况给予恰当的错误值? 我们已经知道,构建错误值体系的 阅读全文
posted @ 2022-04-01 14:11
易先讯
阅读(27)
评论(0)
推荐(0)
摘要:
提到Go语言中的错误处理,我们其实已经在前面接触过几次了。 比如,我们声明过error类型的变量err,也调用过errors包中的New函数。今天,我会用这篇文章为你梳理Go语言错误处理的相关知识,同时提出一些关键问题并与你一起探讨。 我们说过error类型其实是一个接口类型,也是一个Go语言的内建 阅读全文
posted @ 2022-04-01 14:10
易先讯
阅读(32)
评论(0)
推荐(0)
摘要:
在上两篇文章中,我主要为你讲解了与go语句、goroutine和Go语言调度器有关的知识和技法。 内容很多,你不用急于完全消化,可以在编程实践过程中逐步理解和感悟,争取夯实它们。 现在,让我们暂时走下神坛,回归民间。我今天要讲的if语句、for语句和switch语句都属于Go语言的基本流程控制语句。 阅读全文
posted @ 2022-04-01 14:09
易先讯
阅读(41)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我们继续分享go语句执行规则的内容。 在上一篇文章中,我们讲到了goroutine在操作系统的并发编程体系,以及在Go语言并发编程模型中的地位和作用等一系列内容,今天我们继续来聊一聊这个话题。 知识扩展 问题1:怎样才能让主goroutine等待其他goroutine? 我刚才说 阅读全文
posted @ 2022-04-01 14:08
易先讯
阅读(49)
评论(0)
推荐(0)
摘要:
你很棒,已经学完了关于Go语言数据类型的全部内容。我相信你不但已经知晓了怎样高效地使用Go语言内建的那些数据类型,还明白了怎样正确地创造自己的数据类型。 对于Go语言的编程知识,你确实已经知道了不少了。不过,如果你真想玩转Go语言还需要知道它的一些特色流程和语法。 尤其是我们将会在本篇文章中讨论的g 阅读全文
posted @ 2022-04-01 14:05
易先讯
阅读(41)
评论(0)
推荐(0)
摘要:
在前面的文章中,我们已经提到过很多次“指针”了,你应该已经比较熟悉了。不过,我们那时大多指的是指针类型及其对应的指针值,今天我们讲的则是更为深入的内容。 让我们先来复习一下。 type Dog struct { name string } func (dog *Dog) SetName(name s 阅读全文
posted @ 2022-04-01 14:03
易先讯
阅读(38)
评论(0)
推荐(0)
摘要:
我们都知道,结构体类型表示的是实实在在的数据结构。一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型。 前导内容:结构体类型基础知识 当然了,结构体类型也可以不包含任何字段,这样并不是没有意义的,因为我们还可以为类型关联上一些方法,这里你可以把方法看做是函数的特殊版本。 函数是独 阅读全文
posted @ 2022-04-01 14:02
易先讯
阅读(54)
评论(0)
推荐(0)
摘要:
你好,我是郝林,今天我们来聊聊接口的相关内容。 前导内容:正确使用接口的基础知识 在Go语言的语境中,当我们在谈论“接口”的时候,一定指的是接口类型。因为接口类型与其他数据类型不同,它是没法被实例化的。 更具体地说,我们既不能通过调用new函数或make函数创建出一个接口类型的值,也无法用字面量来表 阅读全文
posted @ 2022-04-01 14:02
易先讯
阅读(43)
评论(0)
推荐(0)
摘要:
在前几期文章中,我们分了几次,把Go语言自身提供的,所有集合类的数据类型都讲了一遍,额外还讲了标准库的container包中的几个类型。 在几乎所有主流的编程语言中,集合类的数据类型都是最常用和最重要的。我希望通过这几次的讨论,能让你对它们的运用更上一层楼。 从今天开始,我会开始向你介绍使用Go语言 阅读全文
posted @ 2022-04-01 14:01
易先讯
阅读(52)
评论(0)
推荐(0)
摘要:
我们已经讨论过了通道的基本操作以及背后的规则。今天,我再来讲讲通道的高级玩法。 首先来说说单向通道。我们在说“通道”的时候指的都是双向通道,即:既可以发也可以收的通道。 所谓单向通道就是,只能发不能收,或者只能收不能发的通道。一个通道是双向的,还是单向的是由它的类型字面量体现的。 还记得我们在上篇文 阅读全文
posted @ 2022-04-01 14:00
易先讯
阅读(47)
评论(0)
推荐(0)
摘要:
至今为止,我们讲过的集合类的高级数据类型都属于针对单一元素的容器。 它们或用连续存储,或用互存指针的方式收纳元素,这里的每个元素都代表了一个从属某一类型的独立值。 我们今天要讲的字典(map)却不同,它能存储的不是单一值的集合,而是键值对的集合。 什么是键值对?它是从英文key-value pair 阅读全文
posted @ 2022-04-01 13:59
易先讯
阅读(60)
评论(0)
推荐(0)
摘要:
作为Go语言最有特色的数据类型,通道(channel)完全可以与goroutine(也可称为go程)并驾齐驱,共同代表Go语言独有的并发编程模式和编程哲学。 Don’t communicate by sharing memory; share memory by communicating. (不要 阅读全文
posted @ 2022-04-01 13:59
易先讯
阅读(49)
评论(0)
推荐(0)

浙公网安备 33010602011771号