Golang 从入门到精通系列教程

目录索引

一、预热篇 预热篇 Go 语言零基础入门(一) —— 第一个 Go 程序 Go 语言零基础入门(二) —— Go 项目基本工程管理示例 Go 语言零基础入门(三) —— 单元测试、问题定...

预热篇

函数式编程篇

Go 语言函数式编程系列教程(一) —— 变量声明、初始化、赋值及作用域

变量是几乎所有编程语言中最基本的组成元素。从本质上说,变量相当于是对一块数据存储空间的命名,程序可以通过定义一个变量来申请一块数据存储空间,之后可以通过引用变量名来使用这块存储空间。 由于 Go...

Go 语言函数式编程系列教程(二) —— 常量和枚举

在 Go 语言中,常量是指编译期间就已知且不可改变的值,常量只可以是数值类型(包括整型、 浮点型和复数类型)、布尔类型、字符串类型等标量类型。和 PHP 一样,在 Go 语言中,我们可以通过 c...

Go 语言函数式编程系列教程(三) —— 数据类型篇:概述及布尔类型

支持的数据类型 Go 语言内置对以下这些基本数据类型的支持: 布尔类型:bool 整型:int8、byte、int16、int、uint、uintptr 等 浮点类型:float32、flo...

Go 语言函数式编程系列教程(四) —— 数据类型篇:整型及运算符

整型 整型是所有编程语言里最基础的数据类型,Go 语言默认支持如下这些整型类型: 类型 长度(单位:字节) 说明 值范围 默认值 int8 1 带符号8位整型 -128~127 0 ...

Go 语言函数式编程系列教程(五) —— 数据类型篇:浮点型与复数类型

浮点型 浮点型也叫浮点数,用于表示包含小数点的数据,比如 3.14、1.00 都是浮点型数据。 浮点数的表示 和 PHP 一样,Go 语言中的浮点数采用IEEE-754 标准的表达方式,定义了...

Go 语言函数式编程系列教程(六) —— 数据类型篇:字符串和字符类型

字符串 基本使用 在 Go 语言中,字符串是一种基本类型,默认是通过 UTF-8 编码的字符序列,当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节,比如中文编码...

Go 语言函数式编程系列教程(七) —— 数据类型篇:基本数据类型之间的转化

通过前面几篇教程,我们已经陆续介绍完了 Go 语言中的基本数据类型,分别是布尔类型、整型、浮点型、复数类型、字符串和字符类型,和 PHP 一样,Go 语言也支持这些基本数据类型之间的转化,但是不...

Go 语言函数式编程系列教程(八) —— 数据类型篇:数组及其使用

数组的声明和初始化 数组是所有语言编程中最常用的数据结构之一,Go 语言也不例外,与 PHP、JavaScript 等弱类型动态语言不同,在 Go 语言中,数组是固定长度的、同一类型的数据集合。...

Go 语言函数式编程系列教程(九) —— 数据类型篇:数组切片的创建和遍历

在前一篇教程里我们已经介绍过数组的一个特点:数组的长度在定义之后无法修改,数组长度是数组类型本身的一部分,是数组的一个内置常量,因此我们无法在数组上做动态的元素增删操作。显然这种数据结构无法完全...

Go 语言函数式编程系列教程(十) —— 数据类型篇:在数组切片中动态增删元素

动态增加元素 切片比数组更强大之处在于支持动态增加元素,甚至可以在容量不足的情况下自动扩容,关于容量我们在上篇教程中已经简单提及过,在切片类型中,元素个数和实际可分配的存储空间是两个不同的值,元...

Go 语言函数式编程系列教程(十一) —— 数据类型篇:字典类型的声明、初始化和基本使用

字典定义 有 PHP 基础的同学都应该知道,PHP 数组包含索引数组和关联数组,PHP 中的索引数组即对应 Go 语言的数组和切片类型,PHP 中的关联数组即对应 Go 语言中的字典类型(map...

Go 语言函数式编程系列教程(十二) —— 数据类型篇:字典类型的遍历与排序

遍历字典 我们可以像遍历数据那样对字段类型数据进行遍历: testMap := map[string]int{ "one": 1, "two": 2, "three": ...

Go 语言函数式编程系列教程(十三) —— 数据类型篇:指针的概念和基本使用

指针概述 我们知道,变量的本质对一块内存空间的命名,可以通过引用变量名来使用这块内存空间存储的值,而指针的含义则指向存储这些变量值的内存地址。和 PHP、Java 不同,Go 语言支持指针,如果...

Go 语言函数式编程系列教程(十四) —— 流程控制篇:条件语句

流程控制主要用于设定计算执行的次序,建立程序的逻辑结构。Go 语言的流程控制和 PHP 类似,支持如下的几种流程控制语句: 条件语句:用于条件判断,对应的关键字有 if、else 和 else...

Go 语言函数式编程系列教程(十五) —— 流程控制篇:分支语句

分支语句会根据传入条件的不同,选择不同的分支代码执行。Go 语言的分支语句和 PHP 类似,只是不需要在每个分支结构中显式通过 break 语句退出: switch var1 { cas...

Go 语言函数式编程系列教程(十六) —— 流程控制篇:循环语句

基本使用 与其它编程语言不同的是,Go 语言中的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构。关键字 for 的基本使用方法与 PHP 类似,只是循环条件不含...

Go 语言函数式编程系列教程(十七) —— 流程控制篇:跳转语句

break 与 continue 语句 和 PHP 一样,Go 语言支持在循环语句中通过 break 语句跳出循环,通过 continue 语句进入下一个循环。 关于 break 的基本使用示例...

Go 语言函数式编程系列教程(十八) —— 函数篇:函数的基本定义和调用

几乎所有编程语言都支持函数,编写函数的目的在于将复杂的问题分解为一系列简单的任务来处理,此外同一个函数还可以被多次复用,这一结构在面向过程的函数式编程中至关重要。同为类 C 语言,Go 语言的函...

Go 语言函数式编程系列教程(十九) —— 函数篇:函数的传参和返回值

上篇教程我们介绍了 Go 语言中函数的基本定义和调用,其中也涉及到了函数的传参和返回值,只不过那里演示的是最简单的场景,今天我们就更复杂的传参和返回值进行介绍。 按值传参和引用传参 Go 语言默...

Go 语言函数式编程系列教程(二十) —— 函数篇:变长参数

所谓变长参数指的是函数参数的数量不确定,可以按照需要传递任意数量的参数到指定函数,比如前面演示过的 fmt.Printf 函数的参数显然就是变长参数。 PHP 中的变长参数简介 PHP 函数也支...

Go 语言函数式编程系列教程(二十一) —— 函数篇:匿名函数与闭包

匿名函数 熟悉 Laravel 框架(一个 PHP Web 框架)的同学对匿名函数应该很熟悉,Laravel 框架中有着大量匿名函数的应用场景,比如路由定义、绑定实现到接口等: // 路由定义 ...

Go 语言函数式编程系列教程(二十二) —— 函数篇:系统内置函数

Go 语言提供了一些不需要导入任何包就可以直接使用的内置函数。我们把这些内置函数做一个简单的分类,如下表所示: 名称 说明 close 用于在管道通信中关闭一个管道 len、cap...

Go 语言函数式编程系列教程(二十三) —— 函数篇:递归函数与性能优化

递归函数的编写思路 很对编程语言都支持递归函数,所谓递归函数指的是在函数内部调用函数自身的函数,从数学解题思路来说,递归就是把一个大问题拆分成多个小问题,再各个击破,在实际开发过程中,某个问题满...

面向对象编程篇

Go 语言面向对象编程系列教程(一) —— 类型系统概述

对于面向对象编程的支持,Go 语言的实现可以说是完全颠覆了以往我们对面向对象编程的认知,下面我们先通过对 Go 语言类型系统的介绍让你有一个整体的认知。 Go 语言面向对象编程设计得简洁而优雅。...

Go 语言面向对象编程系列教程(二) —— 类的定义、初始化和成员方法

上篇教程我们简单给大家介绍了 Go 语言的类型系统,关于基础类型、复合类型以及值语义和引用语义我们前 面在数据类型系列里面已经基本都介绍过了,接下来,我们就与 Go 语言面向对象编程相关的特性展...

Go 语言面向对象编程系列教程(三) —— 为基本数据类型添加成员方法

在 Go 语言中,你可以给任意类型(包括基本类型,但不包括指针类型)添加成员方法,但是如果是基本类型的话,需要借助 type 关键字对类型进行再定义,例如: type Integer int ...

Go 语言面向对象编程系列教程(四) —— 通过组合实现类的继承和方法重写

Go 语言不是像 PHP 等传统面向编程实现那样通过 extends 关键字来显式定义子类与父类之间的继承关系,而是通过组合方式实现类似功能,显式定义继承关系的弊端有两个:一个是导致类的层级复杂...

Go 语言面向对象编程系列教程(五) —— 类属性和方法的可见性

前面我们已经陆续介绍了 Go 语言中面向对象的基本特性,包括自定义类的实现、构造函数、成员方法、类的继承、方法重写等,今天我们来系统介绍下类的属性和成员方法的可见性。 在 Go 语言中,没有类似...

Go 语言面向对象编程系列教程(六) —— 接口篇:接口定义与实现

接口在 Go 语言中有着至关重要的地位,如果说 goroutine 和 channel 是支撑起 Go 语言并发模型的基石,那么接口就是 Go 语言整个类型系统的基石。Go 语言的接口不单单只是...

Go 语言面向对象编程系列教程(七) —— 接口篇:通过接口赋值实现接口与实现类的映射

上篇教程我们介绍了接口定义及实现,和 PHP 一样,Go 语言的接口不支持直接实例化,只能通过实现类实现接口声明的所有方法,不过不同之处在于 Go 语言接口支持赋值操作,从而快速实现接口与实现类...

Go 语言面向对象编程系列教程(八) —— 接口篇:接口和类型查询及转化

PHP 中的接口/类型查询 在 PHP 语言中,我们可以通过类型运算符 instanceof 判断某个变量是否属于指定类或接口的实例: <?php interface I { p...

Go 语言面向对象编程系列教程(九) —— 接口篇:通过接口组合实现接口继承

我们知道在 PHP 中支持接口继承以提高代码复用性: <?php interface A { public function foo(); } interface B ext...

Go 语言面向对象编程系列教程(十) —— 接口篇:空接口及其使用场景

熟悉 Java 的同学应该都知道,在这个号称血统最纯正的面向对象编程语言中,「万事万物皆对象」,并且所有类都继承自祖宗类「Object」,所以 Object 类型变量可以指向任何类的实例。 Go...

异常处理篇

并发编程篇

Go 语言并发编程系列教程(一):多进程、多线程与协程的引入

为什么需要并发编程 在原生 PHP 中并没有并发的概念,所有的操作都是串行执行的、同步阻塞的,这也是很多人诟病 PHP 性能的原因,但是不支持并发编程的好处也是显而易见的:保证了 PHP 的简单...

Go 语言并发编程系列教程(二):Go 协程实现原理和使用示例

Go 并发编程原理 Go 语言的协程实现被称之为 goroutine,由 Go 运行时管理,在 Go 语言中通过协程实现并发编程非常简单:我们可以在一个处理进程中通过关键字 go 启用多个协程,...

Go 语言并发编程系列教程(三):Go 协程通信实现(上)—— 共享内存

在上篇教程中,我们已经演示了如何通过 goroutine 基于协程在 Go 语言中实现并发编程,从语法结构来说,Go 语言的协程是非常简单的,只需要通过 go 关键字声明即可,难点在于并发引起的...

Go 语言并发编程系列教程(四):Go 协程通信实现(下)—— 通过 channel 进行消息传递

上篇教程学院君演示了如何通过共享内存实现协程通信,不过这种方式太过繁琐,且维护成本高,Go 语言推荐使用消息传递实现并发通信,这种消息通信机制被称为 channel,中文译作「通道」,可理解为传...

Go 语言并发编程系列教程(五)—— 通道类型篇(一):基本语法和缓冲通道

在上篇教程中,学院君给大家演示了如何通过通道(channel)传递消息实现 Go 协程间的通信, 接下来,我们将通过几篇教程的篇幅来系统了解通道类型及其使用,从而更好地理解 Go 并发编程及其实...

Go 语言并发编程系列教程(六)—— 通道类型篇(二):单向通道及其使用

上篇教程我们介绍了管道类型的基本语法,通常,管道都是支持双向操作的:既可以往管道发送数据,也可以从管道接收数据。但在某些场景下,可能我们需要限制只能往管道发送数据,或者只能从管道接收数据,这个时...

Go 语言并发编程系列教程(七)—— 通道类型篇(三):通过 select 语句等待通道就绪

Go 语言还支持通过 select 分支语句选择指定分支代码执行,select 语句和之前介绍的 switch 语句语法结构类似,不同之处在于 select 的每个 case 语句必须是一个通道...

Go 语言并发编程系列教程(八)—— 通道类型篇(四):错误和异常处理

在前面几篇通道教程中,我们陆续介绍了与通道相关的基本语法、单向通道以及 select 语句,有关通道的基本知识就介绍到这里,今天我们来看下通道使用过程中的错误和异常处理。 在并发编程的通信过程中...

Go 语言并发编程系列教程(九)—— 利用多核 CPU 实现并行计算

开始之前,我们先澄清两个概念,「多核」指的是有效利用 CPU 的多核提高程序执行效率,「并行」和「并发」一字之差,但其实是两个完全不同的概念,「并发」一般是由 CPU 内核通过时间片或者中断来控...

Go 语言并发编程系列教程(十)—— sync 包(一):sync.Mutex 和 sync.RWMutex

sync 包 我们前面反复强调,在 Go 语言并发编程中,倡导「使用通信共享内存,不要使用共享内存通信」,而这个通信的媒介就是我们前面花大量篇幅介绍的通道(Channel),通道是线程安全的,不...

Go 语言并发编程系列教程(十一)—— sync 包(二):条件变量 sync.Cond

sync 包还提供了一个条件变量类型 sync.Cond,它可以和互斥锁或读写锁(以下统称互斥锁)组合使用,用来协调想要访问共享资源的线程。 不过,与互斥锁不同,条件变量 sync.Cond 的...

Go 语言并发编程系列教程(十二)—— sync 包(三):原子操作

中断与原子操作 我们在前两篇教程中讨论了互斥锁、读写锁以及基于它们的条件变量。互斥锁是一个同步工具,它可以保证每一时刻进入临界区的协程只有一个;读写锁对共享资源的写操作和读操作区别看待,并消除了...

Go 语言并发编程系列教程(十三)—— sync 包(四):sync.WaitGroup 和 sync.Once

在介绍通道的时候,如果启用了多个子协程,我们是这样实现主协程等待子协程执行完毕并退出的:声明一个和子协程数量一致的通道数组,然后为每个子协程分配一个通道元素,在子协程执行完毕时向对应的通道发送数...

Go 语言并发编程系列教程(十四)—— 通过 context 包提供的函数实现多协程之间的协作

上篇教程学院君介绍了如何通过 sync.WaitGroup 类型优化通道对多协程协调的处理,但是现在有一个问题,就是我们在启动子协程之前都已经明确知道子协程的总量,如果不知道的话,该怎么实现呢?...

Go 语言并发编程系列教程(十五)—— sync 包(五):临时对象池 sync.Pool

前面我们已经陆续介绍了 sync 包提供的各种同步工具,比如互斥锁、条件变量、原子操作、多协程协作等,今天我们来看另外一种工具。 在高并发场景下,我们会遇到很多问题,垃圾回收(GC)就是其中之一...

Search Results