![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go语言核心36讲
文章平均质量分 91
郑子铭
微软 MVP,DotNet NB,CloudNative NB
展开
-
Go语言核心36讲(新年彩蛋)--学习笔记
新年彩蛋 | 完整版思考题答案基础概念篇Go 语言在多个工作区中查找依赖包的时候是以怎样的顺序进行的?答:你设置的环境变量GOPATH的值决定了这个顺序。如果你在GOPATH中设置了多个工作区,那么这种查找会以从左到右的顺序在这些工作区中进行。你可以通过试验来确定这个问题的答案。例如:先在一个源码文件中导入一个在你的机器上并不存在的代码包,然后编译这个代码文件。最后,将输出的编译错误信息与GOPATH的值进行对比。如果在多个工作区中都存在导入路径相同的代码包会产生冲突吗?答:不会产生冲突原创 2021-12-27 22:20:46 · 224 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用二十六)--学习笔记
48 | 程序性能分析基础(上)作为拾遗的部分,今天我们来讲讲与 Go 程序性能分析有关的基础知识。Go 语言为程序开发者们提供了丰富的性能分析 API,和非常好用的标准工具。这些 API 主要存在于:1、runtime/pprof;2、net/http/pprof;3、runtime/trace;这三个代码包中。另外,runtime代码包中还包含了一些更底层的 API。它们可以被用来收集或输出 Go 程序运行过程中的一些关键指标,并帮助我们生成相应的概要文件以供后续分析时使用。原创 2021-12-19 22:08:07 · 305 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用二十五)--学习笔记
47 | 基于HTTP协议的网络服务我们在上一篇文章中简单地讨论了网络编程和 socket,并由此提及了 Go 语言标准库中的syscall代码包和net代码包。我还重点讲述了net.Dial函数和syscall.Socket函数的参数含义。前者间接地调用了后者,所以正确理解后者,会对用好前者有很大裨益。之后,我们把视线转移到了net.DialTimeout函数以及它对操作超时的处理上,这又涉及了net.Dialer类型。实际上,这个类型正是net包中这两个“拨号”函数的底层实现。我们像上一原创 2021-12-10 23:35:55 · 670 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用二十四)--学习笔记
46 | 访问网络服务前导内容:socket 与 IPC人们常常会使用 Go 语言去编写网络程序(当然了,这方面也是 Go 语言最为擅长的事情)。说到网络编程,我们就不得不提及 socket。socket,常被翻译为套接字,它应该算是网络编程世界中最为核心的知识之一了。关于 socket,我们可以讨论的东西太多了,因此,我在这里只围绕着 Go 语言向你介绍一些关于它的基础知识。所谓 socket,是一种 IPC 方法。IPC 是 Inter-Process Communication 的缩写原创 2021-12-09 23:03:52 · 774 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用二十三)--学习笔记
45 | 使用os包中的API (下)我们在上一篇文章中。从“os.File类型都实现了哪些io包中的接口”这一问题出发,介绍了一系列的相关内容。今天我们继续围绕这一知识点进行扩展。知识扩展问题 1:可应用于File值的操作模式都有哪些?针对File值的操作模式主要有只读模式、只写模式和读写模式。这些模式分别由常量os.O_RDONLY、os.O_WRONLY和os.O_RDWR代表。在我们新建或打开一个文件的时候,必须把这三个模式中的一个设定为此文件的操作模式。除此之外,我们还可以原创 2021-12-09 00:18:01 · 326 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用二十二)--学习笔记
44 | 使用os包中的API (上)我们今天要讲的是os代码包中的 API。这个代码包可以让我们拥有操控计算机操作系统的能力。前导内容:os 包中的 API这个代码包提供的都是平台不相关的 API。那么说,什么叫平台不相关的 API 呢?它的意思是:这些 API 基于(或者说抽象自)操作系统,为我们使用操作系统的功能提供高层次的支持,但是,它们并不依赖于具体的操作系统。不论是 Linux、macOS、Windows,还是 FreeBSD、OpenBSD、Plan9,os代码包都可以为之原创 2021-12-06 23:10:21 · 922 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用二十一)--学习笔记
43 | bufio包中的数据类型(下)在上一篇文章中,我提到了bufio包中的数据类型主要有Reader、Scanner、Writer和ReadWriter。并着重讲到了bufio.Reader类型与bufio.Writer类型,今天,我们继续专注bufio.Reader的内容来进行学习。知识扩展问题 :bufio.Reader类型读取方法有哪些不同?bufio.Reader类型拥有很多用于读取数据的指针方法,这里面有 4 个方法可以作为不同读取流程的代表,它们是:Peek、Read、Re原创 2021-12-05 22:08:27 · 481 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用二十)--学习笔记
42 | bufio包中的数据类型 (上)今天,我们来讲另一个与 I/O 操作强相关的代码包bufio。bufio是“buffered I/O”的缩写。顾名思义,这个代码包中的程序实体实现的 I/O 操作都内置了缓冲区。bufio包中的数据类型主要有:1、Reader;2、Scanner;3、Writer和ReadWriter。与io包中的数据类型类似,这些类型的值也都需要在初始化的时候,包装一个或多个简单 I/O 接口类型的值。(这里的简单 I/O 接口类型指的就是io包中的那些简原创 2021-12-02 22:28:58 · 372 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十九)--学习笔记
41 | io包中的接口和工具 (下)上一篇文章中,我主要讲到了io.Reader的扩展接口和实现类型。当然,io代码包中的核心接口不止io.Reader一个。我们基于它引出的一条主线,只是io包类型体系中的一部分。我们很有必要再从另一个角度去探索一下,以求对io包有更加全面的了解。下面的一个问题就与此有关。知识扩展问题:io包中的接口都有哪些?它们之间都有着怎样的关系?我们可以把没有嵌入其他接口并且只定义了一个方法的接口叫做简单接口。在io包中,这样的接口一共有 11 个。在它原创 2021-12-01 19:39:39 · 390 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十八)--学习笔记
40 | io包中的接口和工具 (上)我们在前几篇文章中,主要讨论了strings.Builder、strings.Reader和bytes.Buffer这三个数据类型。知识回顾还记得吗?当时我还问过你“它们都实现了哪些接口”。在我们继续讲解io包中的接口和工具之前,我先来解答一下这个问题。strings.Builder类型主要用于构建字符串,它的指针类型实现的接口有io.Writer、io.ByteWriter和fmt.Stringer。另外,它其实还实现了一个io包的包级私有接口io.s原创 2021-11-30 21:13:54 · 277 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十七)--学习笔记
39 | bytes包与字节串操作(下)在上一篇文章中,我们分享了bytes.Buffer中已读计数的大致功用,并围绕着这个问题做了解析,下面我们来进行相关的知识扩展。知识扩展问题 1:bytes.Buffer的扩容策略是怎样的?Buffer值既可以被手动扩容,也可以进行自动扩容。并且,这两种扩容方式的策略是基本一致的。所以,除非我们完全确定后续内容所需的字节数,否则让Buffer值自动去扩容就好了。在扩容的时候,Buffer值中相应的代码(以下简称扩容代码)会先判断内容容器的剩余容量,原创 2021-11-29 22:31:00 · 515 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十六)--学习笔记
38 | bytes包与字节串操作(上)前导内容: bytes.Buffer基础知识strings包和bytes包可以说是一对孪生兄弟,它们在 API 方面非常的相似。单从它们提供的函数的数量和功能上讲,差别可以说是微乎其微。只不过,strings包主要面向的是 Unicode 字符和经过 UTF-8 编码的字符串,而bytes包面对的则主要是字节和字节切片。我今天会主要讲bytes包中最有特色的类型Buffer。顾名思义,bytes.Buffer类型的用途主要是作为字节序列的缓冲区。与原创 2021-11-28 22:43:21 · 332 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十五)--学习笔记
37 | strings包与字符串操作Go 语言不但拥有可以独立代表 Unicode 字符的类型rune,而且还有可以对字符串值进行 Unicode 字符拆分的for语句。除此之外,标准库中的unicode包及其子包还提供了很多的函数和数据类型,可以帮助我们解析各种内容中的 Unicode 字符。这些程序实体都很好用,也都很简单明了,而且有效地隐藏了 Unicode 编码规范中的一些复杂的细节。我就不在这里对它们进行专门的讲解了。我们今天主要来说一说标准库中的strings代码包。这个代码包原创 2021-11-27 21:45:37 · 199 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十四)--学习笔记
36 | unicode与字符编码在开始今天的内容之前,我先来做一个简单的总结。Go 语言经典知识总结在数据类型方面有:基于底层数组的切片; 用来传递数据的通道; 作为一等类型的函数; 可实现面向对象的结构体; 能无侵入实现的接口等。在语法方面有:异步编程神器go语句; 函数的最后关卡defer语句; 可做类型判断的switch语句; 多通道操作利器select语句; 非常有特色的异常处理函数panic和recover。除了这些,我们还一起讨论了测试 Go 程序的主要原创 2021-11-27 00:55:17 · 475 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十三)--学习笔记
35 | 并发安全字典sync.Map (下)我们在上一篇文章中谈到了,由于并发安全字典提供的方法涉及的键和值的类型都是interface{},所以我们在调用这些方法的时候,往往还需要对键和值的实际类型进行检查。这里大致有两个方案。我们上一篇文章中提到了第一种方案,在编码时就完全确定键和值的类型,然后利用 Go 语言的编译器帮我们做检查。这样做很方便,不是吗?不过,虽然方便,但是却让这样的字典类型缺少了一些灵活性。如果我们还需要一个键类型为uint32并发安全字典的话,那就不得不再如法炮制地原创 2021-11-26 00:11:06 · 369 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十二)--学习笔记
34 | 并发安全字典sync.Map (上)我们今天再来讲一个并发安全的高级数据结构:sync.Map。众所周知,Go 语言自带的字典类型map并不是并发安全的。前导知识:并发安全字典诞生史换句话说,在同一时间段内,让不同 goroutine 中的代码,对同一个字典进行读写操作是不安全的。字典值本身可能会因这些操作而产生混乱,相关的程序也可能会因此发生不可预知的问题。在sync.Map出现之前,我们如果要实现并发安全的字典,就只能自行构建。不过,这其实也不是什么麻烦事,使用 sync.Mu原创 2021-11-24 22:44:33 · 292 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十一)--学习笔记
33 | 临时对象池sync.Pool到目前为止,我们已经一起学习了 Go 语言标准库中最重要的那几个同步工具,这包括非常经典的互斥锁、读写锁、条件变量和原子操作,以及 Go 语言特有的几个同步工具:1、sync/atomic.Value2、sync.Once3、sync.WaitGroup4、context.Context今天,我们来讲 Go 语言标准库中的另一个同步工具:sync.Pool。sync.Pool类型可以被称为临时对象池,它的值可以被用来存储临时的对象。与 Go原创 2021-11-23 19:44:47 · 460 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用十)--学习笔记
32 | context.Context类型我们在上篇文章中讲到了sync.WaitGroup类型:一个可以帮我们实现一对多 goroutine 协作流程的同步工具。在使用WaitGroup值的时候,我们最好用“先统一Add,再并发Done,最后Wait”的标准模式来构建协作流程。如果在调用该值的Wait方法的同时,为了增大其计数器的值,而并发地调用该值的Add方法,那么就很可能会引发 panic。这就带来了一个问题,如果我们不能在一开始就确定执行子任务的 goroutine 的数量,那么使原创 2021-11-22 21:59:21 · 409 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用九)--学习笔记
31 | sync.WaitGroup和sync.Once我们在前几次讲的互斥锁、条件变量和原子操作都是最基本重要的同步工具。在 Go 语言中,除了通道之外,它们也算是最为常用的并发安全工具了。说到通道,不知道你想过没有,之前在一些场合下里,我们使用通道的方式看起来都似乎有些蹩脚。比如:声明一个通道,使它的容量与我们手动启用的 goroutine 的数量相同,之后再利用这个通道,让主 goroutine 等待其他 goroutine 的运行结束。这一步更具体地说就是:让其他的 gorouti原创 2021-11-21 22:17:07 · 467 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用八)--学习笔记
30 | 原子操作(下)我们接着上一篇文章的内容继续聊,上一篇我们提到了,sync/atomic包中的函数可以做的原子操作有:加法(add)、比较并交换(compare and swap,简称 CAS)、加载(load)、存储(store)和交换(swap)。并且以此衍生出了两个问题。今天我们继续来看第三个衍生问题: 比较并交换操作与交换操作相比有什么不同?优势在哪里?回答是:比较并交换操作即 CAS 操作,是有条件的交换操作,只有在条件满足的情况下才会进行值的交换。所谓的交换指的是,把新值原创 2021-11-18 22:17:51 · 444 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用七)--学习笔记
29 | 原子操作(上)我们在前两篇文章中讨论了互斥锁、读写锁以及基于它们的条件变量,先来总结一下。互斥锁是一个很有用的同步工具,它可以保证每一时刻进入临界区的 goroutine 只有一个。读写锁对共享资源的写操作和读操作则区别看待,并消除了读操作之间的互斥。条件变量主要是用于协调想要访问共享资源的那些线程。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程,它既可以基于互斥锁,也可以基于读写锁。当然了,读写锁也是一种互斥锁,前者是对后者的扩展。通过对互斥锁的合理使用,我们可以原创 2021-11-17 23:23:40 · 247 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用六)--学习笔记
28 | 条件变量sync.Cond (下)问题 1:条件变量的Wait方法做了什么?在了解了条件变量的使用方式之后,你可能会有这么几个疑问。1、为什么先要锁定条件变量基于的互斥锁,才能调用它的Wait方法?2、为什么要用for语句来包裹调用其Wait方法的表达式,用if语句不行吗?这些问题我在面试的时候也经常问。你需要对这个Wait方法的内部机制有所了解才能回答上来。条件变量的Wait方法主要做了四件事。1、把调用它的 goroutine(也就是当前的 goroutine)加入原创 2021-11-16 23:07:11 · 192 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用五)--学习笔记
27 | 条件变量sync.Cond (上)前导内容:条件变量与互斥锁我们常常会把条件变量这个同步工具拿来与互斥锁一起讨论。实际上,条件变量是基于互斥锁的,它必须有互斥锁的支撑才能发挥作用。条件变量并不是被用来保护临界区和共享资源的,它是用于协调想要访问共享资源的那些线程的。当共享资源的状态发生变化时,它可以被用来通知被互斥锁阻塞的线程。比如说,我们两个人在共同执行一项秘密任务,这需要在不直接联系和见面的前提下进行。我需要向一个信箱里放置情报,你需要从这个信箱中获取情报。这个信箱就相当于一个原创 2021-11-16 09:31:08 · 318 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用四)--学习笔记
26 | sync.Mutex与sync.RWMutex从本篇文章开始,我们将一起探讨 Go 语言自带标准库中一些比较核心的代码包。这会涉及这些代码包的标准用法、使用禁忌、背后原理以及周边的知识。既然 Go 语言是以独特的并发编程模型傲视群雄的语言,那么我们就先来学习与并发编程关系最紧密的代码包。前导内容: 竞态条件、临界区与同步工具我们首先要看的就是sync包。这里的“sync”的中文意思是“同步”。我们下面就从同步讲起。相比于 Go 语言宣扬的“用通讯的方式共享数据”,通过共享数据的原创 2021-11-14 09:23:51 · 420 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用三)--学习笔记
25 | 更多的测试手法在本篇文章,我会继续为你讲解更多更高级的测试方法。这会涉及testing包中更多的 API、go test命令支持的,更多标记更加复杂的测试结果,以及测试覆盖度分析等等。前导内容:-cpu 的功能续接前文。我在前面提到了go test命令的标记-cpu,它是用来设置测试执行最大 P 数量的列表的。复习一下,我在讲 go 语句的时候说过,这里的 P 是 processor 的缩写,每个 processor 都是一个可以承载若干个 G,且能够使这些 G 适时地与 M 进行原创 2021-11-12 23:20:56 · 733 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用二)--学习笔记
24 | 测试的基本规则和流程(下)Go 语言是一门很重视程序测试的编程语言,所以在上一篇中,我与你再三强调了程序测试的重要性,同时,也介绍了关于go test命令的基本规则和主要流程的内容。今天我们继续分享测试的基本规则和流程。知识扩展问题 1:怎样解释功能测试的测试结果?demo53.gopackage mainimport ( "errors" "flag" "fmt")var name stringfunc init() { flag.StringVar(原创 2021-11-11 20:32:48 · 662 阅读 · 0 评论 -
Go语言核心36讲(Go语言实战与应用一)--学习笔记
23 | 测试的基本规则和流程 (上)在接下来的日子里,我将带你去学习在 Go 语言编程进阶的道路上,必须掌握的附加知识,比如:Go 程序测试、程序监测,以及 Go 语言标准库中各种常用代码包的正确用法。从上个世纪到今日今时,程序员们,尤其是国内的程序员们,都对编写程序乐此不疲,甚至废寝忘食(比如我自己就是一个例子)。因为这是我们普通人训练自我、改变生活、甚至改变世界的一种特有的途径。不过,同样是程序,我们却往往对编写用于测试的程序敬而远之。这是为什么呢?我个人感觉,从人的本性来讲,我们都或原创 2021-11-10 23:31:00 · 483 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术十六)--学习笔记
22 | panic函数、recover函数以及defer语句(下)我在前一篇文章提到过这样一个说法,panic 之中可以包含一个值,用于简要解释引发此 panic 的原因。如果一个 panic 是我们在无意间引发的,那么其中的值只能由 Go 语言运行时系统给定。但是,当我们使用panic函数有意地引发一个 panic 的时候,却可以自行指定其包含的值。我们今天的第一个问题就是针对后一种情况提出的。知识扩展问题 1:怎样让 panic 包含一个值,以及应该让它包含什么样的值?这其实很简单原创 2021-11-09 23:09:44 · 225 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术十五)--学习笔记
21 | panic函数、recover函数以及defer语句 (上)在本篇,我要给你展示 Go 语言的另外一种错误处理方式。不过,严格来说,它处理的不是错误,而是异常,并且是一种在我们意料之外的程序异常。前导知识:运行时恐慌 panic这种程序异常被叫做 panic,我把它翻译为运行时恐慌。其中的“恐慌”二字是由 panic 直译过来的,而之所以前面又加上了“运行时”三个字,是因为这种异常只会在程序运行的时候被抛出来。我们举个具体的例子来看看。比如说,一个 Go 程序里有一个切片,它的原创 2021-11-08 20:47:12 · 283 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术十四)--学习笔记
20 | 错误处理 (下)在上一篇文章中,我们主要讨论的是从使用者的角度看“怎样处理好错误值”。那么,接下来我们需要关注的,就是站在建造者的角度,去关心“怎样才能给予使用者恰当的错误值”的问题了。知识扩展问题:怎样根据实际情况给予恰当的错误值?我们已经知道,构建错误值体系的基本方式有两种,即:创建立体的错误类型体系和创建扁平的错误值列表。先说错误类型体系。由于在 Go 语言中实现接口是非侵入式的,所以我们可以做得很灵活。比如,在标准库的net代码包中,有一个名为Error的接口类型。它算原创 2021-11-07 11:12:09 · 106 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术十三)--学习笔记
19 | 错误处理(上)提到 Go 语言中的错误处理,我们其实已经在前面接触过几次了。比如,我们声明过error类型的变量err,也调用过errors包中的New函数。我们说过error类型其实是一个接口类型,也是一个 Go 语言的内建类型。在这个接口类型的声明中只包含了一个方法Error。Error方法不接受任何参数,但是会返回一个string类型的结果。它的作用是返回错误信息的字符串表示形式。我们使用error类型的方式通常是,在函数声明的结果列表的最后,声明一个该类型的结果,同时在调用原创 2021-11-03 22:47:16 · 127 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术十二)--学习笔记
18 | if语句、for语句和switch语句现在,让我们暂时走下神坛,回归民间。我今天要讲的if语句、for语句和switch语句都属于 Go 语言的基本流程控制语句。它们的语法看起来很朴素,但实际上也会有一些使用技巧和注意事项。我在本篇文章中会以一系列面试题为线索,为你讲述它们的用法。那么,今天的问题是:使用携带range子句的for语句时需要注意哪些细节?这是一个比较笼统的问题。我还是通过编程题来讲解吧。本问题中的代码都被放在了命令源码文件 demo41.go 的main函数中的。为了.原创 2021-11-02 22:42:38 · 141 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术十一)--学习笔记
17 | go语句及其执行规则(下)知识扩展问题 1:怎样才能让主 goroutine 等待其他 goroutine?我刚才说过,一旦主 goroutine 中的代码执行完毕,当前的 Go 程序就会结束运行,无论其他的 goroutine 是否已经在运行了。那么,怎样才能做到等其他的 goroutine 运行完毕之后,再让主 goroutine 结束运行呢?其实有很多办法可以做到这一点。其中,最简单粗暴的办法就是让主 goroutine“小睡”一会儿。for i := 0; i <原创 2021-10-31 23:35:39 · 316 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术十)--学习笔记
16 | go语句及其执行规则(上)我们已经知道,通道(也就是 channel)类型的值,可以被用来以通讯的方式共享数据。更具体地说,它一般被用来在不同的 goroutine 之间传递数据。那么 goroutine 到底代表着什么呢?简单来说,goroutine 代表着并发编程模型中的用户级线程。你可能已经知道,操作系统本身提供了进程和线程,这两种并发执行程序的工具。前导内容:进程与线程进程,描述的就是程序的执行过程,是运行着的程序的代表。换句话说,一个进程其实就是某个程序运行时的一个产物。原创 2021-10-30 12:57:16 · 178 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术九)--学习笔记
15 | 关于指针的有限操作在前面的文章中,我们已经提到过很多次“指针”了,你应该已经比较熟悉了。不过,我们那时大多指的是指针类型及其对应的指针值,今天我们讲的则是更为深入的内容。让我们先来复习一下。type Dog struct { name string}func (dog *Dog) SetName(name string) { dog.name = name}对于基本类型Dog来说,*Dog就是它的指针类型。而对于一个Dog类型,值不为nil的变量dog,取址表达原创 2021-10-28 22:36:44 · 203 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术八)--学习笔记
14 | 接口类型的合理运用前导内容:正确使用接口的基础知识在 Go 语言的语境中,当我们在谈论“接口”的时候,一定指的是接口类型。因为接口类型与其他数据类型不同,它是没法被实例化的。更具体地说,我们既不能通过调用new函数或make函数创建出一个接口类型的值,也无法用字面量来表示一个接口类型的值。对于某一个接口类型来说,如果没有任何数据类型可以作为它的实现,那么该接口的值就不可能存在。我已经在前面展示过,通过关键字type和interface,我们可以声明出接口类型。接口类型的类型原创 2021-10-27 23:45:27 · 372 阅读 · 1 评论 -
Go语言核心36讲(Go语言进阶技术七)--学习笔记
13 | 结构体及其方法的使用法门我们都知道,结构体类型表示的是实实在在的数据结构。一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型。前导内容:结构体类型基础知识当然了,结构体类型也可以不包含任何字段,这样并不是没有意义的,因为我们还可以为类型关联上一些方法,这里你可以把方法看做是函数的特殊版本。函数是独立的程序实体。我们可以声明有名字的函数,也可以声明没名字的函数,还可以把它们当做普通的值传来传去。我们能把具有相同签名的函数抽象成独立的函数类型,以作为一组输入、输出(原创 2021-10-25 23:40:50 · 191 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术六)--学习笔记
12 | 使用函数的正确姿势在前几期文章中,我们分了几次,把 Go 语言自身提供的,所有集合类的数据类型都讲了一遍,额外还讲了标准库的container包中的几个类型。在几乎所有主流的编程语言中,集合类的数据类型都是最常用和最重要的。我希望通过这几次的讨论,能让你对它们的运用更上一层楼。从今天开始,我会开始向你介绍使用 Go 语言进行模块化编程时,必须了解的知识,这包括几个重要的数据类型以及一些模块化编程的技巧。首先我们需要了解的是 Go 语言的函数以及函数类型。前导内容:函数是一等的公民原创 2021-10-24 21:54:50 · 167 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术五)--学习笔记
11 | 通道的高级玩法我们已经讨论过了通道的基本操作以及背后的规则。今天,我再来讲讲通道的高级玩法。首先来说说单向通道。我们在说“通道”的时候指的都是双向通道,即:既可以发也可以收的通道。所谓单向通道就是,只能发不能收,或者只能收不能发的通道。一个通道是双向的,还是单向的是由它的类型字面量体现的。还记得我们在上篇文章中说过的接收操作符<-吗?如果我们把它用在通道的类型字面量中,那么它代表的就不是“发送”或“接收”的动作了,而是表示通道的方向。比如:var uselessCh原创 2021-10-22 23:15:54 · 173 阅读 · 0 评论 -
Go语言核心36讲(Go语言进阶技术四)--学习笔记
10 | 通道的基本操作作为 Go 语言最有特色的数据类型,通道(channel)完全可以与 goroutine(也可称为 go 程)并驾齐驱,共同代表 Go 语言独有的并发编程模式和编程哲学。Don’t communicate by sharing memory; share memory by communicating. (不要通过共享内存来通信,而应该通过通信来共享内存。)这是作为 Go 语言的主要创造者之一的 Rob Pike 的至理名言,这也充分体现了 Go 语言最重要的编程理念。而原创 2021-10-21 21:43:34 · 310 阅读 · 0 评论