文章分类 - go
摘要:使用锁的场景:多个goroutine通过共享内存(变量)实现数据通信,就会出现并发安全问题,于是就需要加锁。python中多线程实现数据通信,也是通过共享变量或者Queue队列的方式。 临界区 在学习 Mutex 之前,我们需要理解并发编程中临界区(Critical Section)的概念。当程序并
阅读全文
摘要:什么是 select? select 语句用于在多个发送/接收信道操作中进行选择。select 语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,select 会随机地选取其中之一执行。该语法与 switch 类似,所不同的是,这里的每个 case 语句都是信道操作。我们好好看
阅读全文
摘要:什么是缓冲信道? 在[上一教程]里,我们讨论的主要是无缓冲信道。我们在[信道]的教程里详细讨论了,无缓冲信道的发送和接收过程是阻塞的。 我们还可以创建一个有缓冲(Buffer)的信道。只在缓冲已满的情况,才会阻塞向缓冲信道(Buffered Channel)发送数据。同样,只有在缓冲为空的时候,才会
阅读全文
摘要:1 什么是信道? 信道可以想像成 Go 协程之间通信的管道,不同goroutine之间通信通过channel实现,同时实现了让主程序等待Go协程执行结束(实际程序中,不能用time模块来模拟goroutine执行的时间)。如同管道中的水会从一端流到另一端,通过使用信道,数据也可以从一端发送,在另一端
阅读全文
摘要:Go 协程是什么? 我们知道,线程是cpu能够调度的最小单位,在单线程下实现并发我们称之为协程。 Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。 G
阅读全文
摘要:Go 是并发式语言,而不是并行式语言。在讨论 Go 如何处理并发之前,我们必须理解何为并发,以及并发与并行的区别。 并发是什么? 并发是指同一时间段内,多个任务在执行(单个cpu,执行多个任务)。一个例子就能很好地说明这一点。 我们可以想象一个人正在跑步。假如在他晨跑时,鞋带突然松了。于是他停下来,
阅读全文
摘要:Go 通过[接口]来实现多态。我们已经讨论过,在 Go 语言中,我们是隐式地实现接口。一个类型如果定义了接口所声明的全部[方法],那它就实现了该接口。现在我们来看看,利用接口,Go 是如何实现多态的。 使用接口实现多态 一个类型如果定义了接口的所有方法,那它就隐式地实现了该接口。 所有实现了接口的类
阅读全文
摘要:Go 不支持继承,但它支持组合(Composition)。组合一般定义为“合并在一起”。汽车就是一个关于组合的例子:一辆汽车由车轮、引擎和其他各种部件组合在一起。 通过嵌套结构体进行组合 在 Go 中,通过在结构体内嵌套结构体,可以实现组合。组合的典型例子就是博客帖子。每一个博客的帖子都有标题、内容
阅读全文
摘要:1 Go 支持面向对象吗? Go 并不是完全面向对象的编程语言。Go 官网回答了 Go 是否是面向对象语言,摘录如下。 可以说是,也可以说不是。虽然 Go 有类型和方法,支持面向对象的编程风格,但却没有类型的层次结构。Go 中的“接口”概念提供了一种不同的方法,我们认为它易于使用,也更为普遍。Go
阅读全文
摘要:new()用来分配内存,但与其他语言中的同名函数不同,它不会初始化内存,只会将内存置零。 make()的目的不同于new(),它只能创建map、silce、channel,并返回类型为T(非指针)的已初始化(非零值)的值。 new(T)会返回一个指针,该指针指向新的分配,类型为T的零值,适用于创建结
阅读全文
摘要:1 集合介绍 集合是一个重要的数据结构,其中:集合中的元素不可重复;集合中的元素无序排列 由于go语言中没有集合元素,现在我们来通过map实现一个集合元素,使其具备以下功能: 增加元素:set 删除元素:delete 判断元素是否存在:isExist 查看集合长度:len 2 代码实现 packag
阅读全文
摘要:1 什么是接口? 在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。 在Go语言中接口(interface)是一种类型,一种抽象的类型。相较于之前章节中讲到的那些具体类型(字符串、切片、结构体等)更注重“
阅读全文
摘要:1 什么是方法? 方法其实就是一个函数,在 func 这个关键字和方法名中间加入了一个特殊的接收器类型。接收器可以是结构体类型或者是非结构体类型。接收器是可以在方法的内部访问的。 Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的
阅读全文
摘要:1 什么是结构体? 结构体是用户定义的类型,表示若干个字段(Field)的集合,也就是一系列属性的集合,类似于python中的类,但是只有属性没有方法。有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体。 例如,一个职员有 firstName、lastName 和 age
阅读全文
摘要:1 什么是指针? 指针是一种存储变量内存地址(Memory Address)的变量,所以又叫指针类型或引用类型。 如上图所示,变量 b 的值为 156,而 b 的内存地址为 0x1040a124。变量 a 存储了 b 的地址。我们就称 a 指向了 b。 2 指针的声明 指针变量的类型为 *T,该指针
阅读全文
摘要:1 什么是字符串? Go 语言中的字符串是一个字节切片。把内容放在双引号””之间,我们可以创建一个字符串。让我们来看一个创建并打印字符串的简单示例。 package main import ( "fmt" ) func main() { name := "Hello World" fmt.Print
阅读全文
摘要:1 什么是 map ? map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值。 2 如何创建 map ? 2.1 定义并初始化 通过向 make 函数传入键和值的类型,可以创建 map。make(map[type of key]type of value)
阅读全文
摘要:什么是可变参数函数 可变参数函数是一种参数个数可变的函数。 语法 如果函数最后一个参数被记作 ...T ,这时函数可以接受任意个 T 类型参数作为最后一个参数。 请注意只有函数的最后一个参数才允许是可变的。 通过一些例子理解可变参数函数如何工作 你是否曾经想过 append 函数是如何将任意个参数值
阅读全文
摘要:1 数组 数组是同一类型元素的集合,内存中连续存储。例如,整数集合 5,8,9,79,76 形成一个数组。Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(当然,如果是 interface{} 类型数组,可以包含任意类型) 1.1 数组的声明 一个数组的表示形式为 [n]T。n 表
阅读全文
摘要:switch 是一个条件语句,用于将表达式的值与可能匹配的选项列表进行比较,并根据匹配情况执行相应的代码块。它可以被认为是替代多个 if else 子句的常用方式。看代码比文字更容易理解。让我们从一个简单的例子开始,它将把一个手指的编号作为输入,然后输出该手指对应的名字。比如 0 是拇指,1 是食指
阅读全文