[译] part 9: golang 循环语句
循环语句被用来重复执行一块代码。 for是 Go 中唯一的循环语句。 Go 没有while或do while循环,这些循环存在于其他如 C 语言中。 初始化语句只执行一次。初始化循环后,将检查条件。如果条件的计算结果为true,则执行{}内的循环体,然后执行post语句。pos…
[译] part 10: golang switch 语句
switch是一个条件语句,它计算表达式并将其和可能的结果进行匹配,根据匹配执行代码块。它常用来替代多个 if else 子句。 光说不练假把式,让我们从一个简单的例子开始,该例子将手指号作为输入并输出该手指的名称:)。例如 1 是拇指,2 是无名指,依此类推。 在上述程序中,…
[译] part 12: goalng 变参函数
变参函数是一个可以接受参数数量可变的函数。 如果函数的最后一个参数用...T表示,那么该函数最后一个参数可以接受任意数量的T类型的参数。 注意,只允许函数的最后一个参数为可变参数。 append函数可以增加任意数量的参数给切片。变参函数就是用到了切片的这个原理。 以上是appe…
[译] part 11: goalng 数组和切片
这一章我们将学习 Go 语言中的数组和切片。 数组是属于同一类型的元素的集合。例如,整数 5, 8, 9, 79, 76 的集合可以构成数组。Go 中的数组不允许混合不同类型的值,例如包含字符串和整数。 数组的表示为[n] T。n 表示数组中元素的数量,T 表示每个元素的类型。…
[译] part 13: golang 映射 map
map 是 Go 中的内置类型,它将值与键相关联。可以使用相应的键查找该值。 上面的代码创建了一个叫personSalary的 map,它的键的类型为string,值的类型为int。 map 的零值为nil,如果你尝试给空 map 增加元素,运行时将会触发 panic,因此,必…
[译] part 33: golang 头等函数
支持头等函数的语言允许将函数赋值给变量,作为参数传递给其他函数并从其他函数返回。 Go 支持头等函数功能。 在本教程中,我们将讨论头等函数的语法和各种用例。 让我们从一个简单的例子开始,它将一个函数赋给变量。 在上面的程序中的第 8 行,我们为变量a分配了一个函数。 这是将函数…
[译] part 28: golang 的面向对象 -- 多态
Go 中的多态性是在接口的帮助下实现的。正如我们已经讨论过的,接口可以在 Go 中隐式实现。如果类型为接口中声明的所有方法提供定义,则类型实现接口。让我们看看在接口的帮助下如何在 Go 中实现多态性。 任何定义了接口的所有方法的类型都被称为隐式实现了该接口。 一个接口类型的变量…
[译] part 27: golang 的面向对象 -- 组合取代继承
Go 不支持继承,但它支持组合。组合的通用定义是“放在一起”。组合的一个例子是汽车。汽车由车轮,发动机和各种其他部件组成。 Go 中的组合可以通过将一种结构类型嵌入到另一种结构类型中来实现。 博客文章是一个完美的组合示例。每篇博文都有标题,内容和作者信息。这可以使用组合完美地表…
[译] part 26: golang 的面向对象 -- 结构取代类
Go 不是纯粹的面向对象的编程语言。摘自 Go 的常见问题解答,回答了 Go 是否面向对象的问题。 在即将到来的教程中,我们将讨论如何使用 Go 实现面向对象的编程概念。与其他面向对象的语言(如 Java)相比,它们中的一些在实现上有很大不同。 Go 没有提供类,但它提供了结构…
[译] part 34: golang 反射 reflection
反射是 Go 的高级主题之一,我会尽量让它变得简单。 本教程包含以下部分。 我们现在一个一个来讨论这些部分。 反射是为了程序在运行时检查其变量和值并找到其类型。你可能不明白这意味着什么,但没关系。在本教程结束时,您将清楚地了解反射,请跟紧我。 在学习反射时,任何人都会想到的第一…
[译] part 19: golang 接口 2
我们在上一篇文章中讨论的所有示例接口都是使用值接收者实现的。也可以使用指针接收者实现接口。在使用指针接收者实现接口时需要注意一些细微之处。让我们使用以下程序了解一下。 在上面的程序中的第 13 行,Person结构使用值接收者实现了Describer接口。 正如我们之前已经学过…
[译] part 18: golang 接口 1
面向对象世界中接口的定义是“接口定义对象的行为”。它只指定对象应该做什么。实现此行为(实现细节)的方法取决于对象。 在 Go 的世界里,接口是一组方法签名。当一个类型为接口中的所有方法提供定义时,就说它实现了该接口。它与 OOP 世界非常相似。接口指定类型应具有的方法,类型决定…
[译] part 17: golang 方法 methods
方法是一个具有特殊接收者类型的函数,接收者在func关键字和方法名称之间。接收者可以是struct类型或非struct类型。接收者可用于方法内部的访问。 以下是创建方法的语法。 上面的代码片段创建了一个名为methodName的方法,该方法具有类型为Type的接收者。 让我们编…
[译] part 16: golang 结构体 structures
结构是用户定义的类型,表示字段集合。它可以将一组数据放到结构中,而不是将它们作为单独的类型进行维护。 例如,员工具有firstName,lastName和age。将这三个属性组合成一个结构employee是有意义的。 上面的代码片段声明了一个结构类型Employee,其中包含f…
[译] part 15: golang 指针 pointers
指针是存储另一个变量的内存地址的变量。 在上面的图示中,变量b值为 156 并存储在内存地址 0x1040a124 处。变量a保存了b的地址,那么a就是指针并指向b。 * T是指针变量的类型,它指向类型为T的值。 &运算符用于获取变量的地址。上面程序的第 9 行,我们将b的地址…
[译] part25: golang Mutex 互斥锁
在本教程中,我们将了解互斥锁Mutex。我们还将学习如何使用Mutex和channel解决竞态条件。 在了解互斥锁之前,先了解并发编程中临界区的概念非常重要。当程序并发运行时,多个Goroutines不应该同时拥有修改共享内存的权限。修改共享内存的这部分代码则称为临界区。例如,…
[译] part24: golang select
select语句用于从多个发送/接收channel中进行选择的操作。 select语句将阻塞直到其中一个发送/接收操作准备就绪。如果有多个操作就绪,则随机选择其中一个操作。语法类似于switch,只是每个case语句被一个channel操作取代了。让我们深入研究一些代码,以便更…
[译] part23: golang 缓冲 channel 和协程池
我们在上一个教程中讨论的所有channel基本上都是无缓冲的。正如我们在channel教程中详细讨论的那样,发送和接收到无缓冲的channel都是阻塞的。 可以使用缓冲区创建channel。仅当缓冲区已满时才会阻塞对缓冲channel的发送。类似地,仅当缓冲区为空时才阻塞从缓冲…
[译] part 22: golang channels
在上一个教程中,我们讨论了 Go 中如何使用Goroutines实现并发。在本教程中,我们将讨论有关channel以及Goroutines如何使用channel进行通信。 channel可以被认为是Goroutines通信的管道。类似于水在管道中从一端流到另一端的方式,数据可以…
[译] part 21: golang goroutines
在前面的教程中,我们讨论了并发以及它与并行的不同之处。在本教程中,我们将讨论如何使用Goroutines在 Go 中实现并发性。 Goroutines是与其他函数或方法同时运行的函数或方法。 Goroutines可以被认为是轻量级线程。与线程相比,创建Goroutine的成本很…