
Go语言核心36讲
文章平均质量分 89
Go 语言是由 Google 出品的一门通用型计算机编程语言。作为在近年来快速崛起的编程语言,Go 已经成功跻身主流编程语言的行列。
韩淼燃
最近在更新运维专栏。欢迎大家来点赞,关注。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
使用函数的正确姿势
实际上,如果它是个常量,那也就形成不了闭包了,因为常量是不可变的程序实体,而闭包体现的却是由“不确定”变为“确定”的一个过程。只要两个函数的参数列表和结果列表中的元素顺序及其类型是一致的,我们就可以说它们是一样的函数,或者说是实现了同一个函数类型的函数。原因是,所有传给函数的参数值都会被复制,函数在其内部使用的并不是参数值的原值,而是它的副本。以切片值为例,如此复制的时候,只是拷贝了它指向底层数组中某一个元素的指针,以及它的长度值和容量值,而它的底层数组并不会被拷贝。类型的签名一致,并且实现得当就可以了。原创 2023-05-29 10:31:25 · 368 阅读 · 0 评论 -
通道的高级玩法
函数的时候,只需要把一个元素类型匹配的双向通道传给它就行了,没必要用发送通道,因为 Go 语言在这种情况下会自动地把双向通道转换为函数所需的单向通道。另外,我们在 Go 语言中还可以声明函数类型,如果我们在函数类型中使用了单向通道,那么就相等于在约束所有实现了这个函数类型的函数。如果我们把它用在通道的类型字面量中,那么它代表的就不是“发送”或“接收”的动作了,而是表示通道的方向。的左边,那么就说明该通道只能收不能发。注意,与发送操作和接收操作对应,这里的“发”和“收”都是站在操作通道的代码的角度上说的。原创 2023-05-11 10:17:06 · 284 阅读 · 1 评论 -
通道的基本操作
今天我们讲到了通道的一些常规操作,包括初始化、发送、接收和关闭。通道类型是 Go 语言特有的,所以你一开始肯定会感到陌生,其中的一些规则和奥妙还需要你铭记于心,并细心体会。首先是在初始化通道时设定其容量的意义,这有时会让通道拥有不同的行为模式。对通道的发送操作和接收操作都有哪些基本特性,也是我们必须清楚的。这涉及了它们什么时候会互斥,什么时候会造成阻塞,什么时候会引起 panic,以及它们收发元素值的顺序是怎样的,它们是怎样保证元素值的完整性的,元素值通常会被复制几次,等等。原创 2023-04-21 10:33:30 · 290 阅读 · 0 评论 -
字典的操作和约束
我们这次主要讨论了与字典类型有关的,一些容易让人困惑的问题。比如,为什么字典的键类型会受到约束?又比如,我们通常应该选取什么样的类型作为字典的键类型。我以 Go 语言规范为起始,并以 Go 语言源码为依据回答了这些问题。认真看了这篇文章之后,你应该对字典中的映射过程有了一定的理解。另外,对于 Go 语言在那些合法的键类型上所做的求哈希和判等的操作,你也应该有所了解了。再次强调,永远要注意那些可能引发 panic 的操作,比如像一个值为。原创 2023-04-19 10:30:39 · 276 阅读 · 0 评论 -
container包中的那些容器
这个代码包中有两个公开的程序实体——List和Element,List 实现了一个双向链表(以下简称链表),而 Element 则代表了链表中元素的结构。原创 2023-03-22 10:20:45 · 261 阅读 · 0 评论 -
数组和切片
总结一下,我们今天一起探讨了数组和切片以及它们之间的关系。切片是基于数组的,可变长的,并且非常轻快。一个切片的容量总是固定的,而且一个切片也只会与某一个底层数组绑定在一起。此外,切片的容量总会是在切片长度和底层数组长度之间的某一个值,并且还与切片窗口最左边对应的元素在底层数组中的位置有关系。那两个分别用减法计算切片长度和容量的方法你一定要记住。另外,原创 2023-03-09 11:47:27 · 255 阅读 · 0 评论 -
程序实体的那些事儿 (下)
在本篇文章中,我们聚焦于类型。Go 语言中的每个变量都是有类型的,我们可以使用类型断言表达式判断变量是哪个类型的。正确使用该表达式需要一些小技巧,比如总是应该把结果赋给两个变量。另外还要保证被判断的变量是接口类型的,这可能会用到类型转换表达式。我们在使用类型转换表达式对变量的类型进行转换的时候,会受到一套规则的严格约束。我们必须关注这套规则中的一些细节,尤其是那些 Go 语言命令不会帮你检查的细节,否则就会踩进所谓的“陷阱”中。原创 2023-03-09 10:47:11 · 225 阅读 · 0 评论 -
程序实体的那些事儿(中)
我们先讨论了代码块,并且也谈到了它与程序实体的作用域,以及访问权限控制之间的巧妙关系。Go 语言本身对程序实体提供了相对粗粒度的访问控制。但我们自己可以利用代码块和作用域精细化控制它们。如果在具有嵌套关系的不同代码块中存在重名的变量,那么我们应该特别小心,它们之间可能会发生“屏蔽”的现象。这样你在不同代码块中引用到变量很可能是不同的。具体的鉴别方式需要参考 Go 语言查找(代表了程序实体的)标识符的过程。另外,请记住变量重声明与可重名变量之间的区别以及它们的重要特征。原创 2023-03-01 10:30:26 · 210 阅读 · 0 评论 -
程序实体的那些事儿(上)
如果只用一两句话回答这个问题的话,我想可以是这样的:Go 语言的类型推断可以明显提升程序的灵活性,使得代码重构变得更加容易,同时又不会给代码的维护带来额外负担(实际上,它恰恰可以避免散弹式的代码修改),更不会损失程序的运行效率。在 Go 语言中,变量的类型可以是其预定义的那些类型,也可以是程序自定义的函数、结构体或接口。可以想象,如果不这样会多写不少代码。Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予足够的信息,这样才可以让 Go 语言能够推导出它们的类型。原创 2022-12-14 12:22:00 · 315 阅读 · 0 评论 -
库源码文件
我们在本篇文章中详细讨论了把代码从命令源码文件中拆分出来的方法,这包括拆分到其他库源码文件,以及拆分到其他代码包。这里涉及了几条重要的 Go 语言基本编码规则,即:代码包声明规则、代码包导入规则以及程序实体的访问权限规则。在进行模块化编程时,你必须记住这些规则,否则你的代码很可能无法通过编译。原创 2022-12-13 17:46:49 · 442 阅读 · 0 评论 -
命令源码文件
这有很多种方式,最简单的一种方式就是对变量flag.Usage重新赋值。flag.Usage的类型是func(),即一种无参数声明且无结果声明的函数类型。flag.Usage变量在声明时就已经被赋值了,所以我们才能够在运行命令时看到正确的结果。注意,对flag.Usage的赋值必须在调用flag.Parse函数之前。现在,我们把 demo2.go 另存为 demo3.go,然后在main函数体的开始处加入如下代码。}那么当运行后,就会看到现在再深入一层,我们在调用flag包中的一些函数(比如。原创 2022-11-16 11:40:43 · 490 阅读 · 0 评论 -
工作区和GOPATH
工作区和 GOPATH 的概念和含义是每个 Go 工程师都需要了解的。虽然它们都比较简单,但是说它们是 Go 程序开发的核心知识并不为过。然而,我在招聘面试的过程中仍然发现有人忽略掉了它们。Go 语言提供的很多工具都是在 GOPATH 和工作区的基础上运行的,比如上面提到的go build、go install和go get,这三个命令也是我们最常用到的。原创 2022-10-10 20:32:37 · 383 阅读 · 0 评论