-
Go 语言拓展以有类型
在开发中,仅仅使用 Go 语言自带的变量是无法满足我们的业务需求的,就算勉强能满足,对我们整个项目代码后期的维护和其可读性,都会带来很大的不便。所以几乎所有语言都支持自定义数据类型,用于拓展已有的数据类型来适应日新月异的开发场景。在 Go 语言中可以使用 type 关键字自定义数据类型。 1. 自定义复杂类型 我们可以使用type Name Type去自定义一个全新的数据类型。这个类型的变量就使用Name来声明。通常type用于将一个复杂的数据类型定义为一个全新的数据类型,便于后续…
-
Go 语言中的 range
在线程不安全的 map 中我们学习了 map 的遍历,里面使用了一个叫 range 的关键字来对 map 进行遍历操作。当时还提到了切片和数组都可以使用这个方法遍历。本文就来详细学习一下 range 关键字的用法。 Tips:本文提及的 map 均是线程不安全的 map。线程安全的 map 及其遍历方法参照 Go 语言中的map 一文。 1. 基本用法 range 可以用来遍历的对象有数组、切片、map、字符串以及通道。遍历的对象不同,range 的返回值也会有所不同。遍历数组、切…
-
Go 语言中的 Map
本文介绍一种特殊的数据结构。它是一种元素对的无序集合,每一个索引(key)对应一个值(value),这种数据结构在 Go 语言中被称之为 map。map 是一种能够通过索引(key)迅速找到值(value)的数据结构,所以也被称为字典。在 Go 语言中因为线程安全问题,一共实现了两种类型的 map,接下来我们每种都了解一下。 Tips:线程的知识会在Go语言的多线程中讲解。 1. 无锁的map 这种类型的 map 是线程不安全的 map,多个线程同时访问这个类型的 map 的同一个…
-
Go 语言中的切片
本位主要介绍一下 Go 语言中可变长度的"数组"——切片(slice)。数组有数组的用处,但是其不可变长度的特性,注定了在大多场景下不是很受欢迎。在大多数场景下我们都会选择更加灵活的切片。 1. 切片的创建 切片的声明方式和数组类似,写法上看就是声明一个没有长度的数组:var 切片名 []切片类型。其中切片类型可以是切片本身,也就是切片的切片,就构成了多维的切片。 切片在使用之前必须要初始化,它没有零值。声明后它的值是 nil,这是因为它的底层实现是一个指向数组的指针,在你给它存入…
-
Go 语言中的数组
数组是一个可以存放相同数据类型数据的定长序列。由于数组是定长的,在使用场景并不丰富,所以在 Go 语言中通常使用的是切片(Slice)。想要使用切片,就先要了解数组,所以在本文先介绍 Go 语言中数组的使用。 1. 数组的声明 数组的声明形式形如var 数组名 [数组长度]数组类型,其中数组类型可以是数组本身,也就是数组类型的数组,这样就构成了多维数组。和变量的声明相同,数组在声明时会初始化变量类型的零值。 代码示例 代码块 1 package main 2 3 import …
-
Go 语言的指针
本文主要介绍 Go 语言中的指针。Go 语言中和 C/C++ 一样,直接提供了指针类型,但是不同的是 Go 语言的指针并没有那么高深莫测,因为它是无法进行位移和运算的,它只是一个存储了其它变量地址的变量而已。它在 Go 语言中最大的作用就是在值传递的过程中减少内存消耗,毕竟一个地址的存储开销是十分少的。 1.指针的定义和使用 在 Go 语言中指针类型的声明和 C/C++ 类似,都是采用*符号来区分正常类型变量和指针变量。 代码示例: 代码块 1 package main 2 3 …
-
Go 语言中的闭包
本文主要介绍 Go 语言中的闭包。简单的说 Go 语言的闭包就是一个引用了外部自由变量的匿名函数,被引用的自由变量和该匿名函数共同存在,不会因为离开了外部环境就被释放或者删除,还可以在这个匿名函数中继续使用。 1. Go 语言的匿名函数 在上文中我们了解到了一个新的词汇——匿名函数,我们先来学习一下Go语言中的匿名函数,再来了解在 Go 语言中如何使用闭包。匿名函数,顾名思义,就是隐藏函数名的函数。 代码示例: 代码块 1 package main 2 3 import ( 4…
-
Go 语言函数中的defer
在 Go 语言中的 defer 关键字就是 Go 语言中延迟语句的标志。Go 语言会在函数即将返回时按逆序执行 defer 后的语句。也就是说先被 defer 的语句后执行,最先执行最后被 defer 的语句。defer 和有些语言中的 finally 语句块的用法类似,一般都用于释放一些资源,最常用的地方就是进程锁的释放。 Tips:关于 defer 的进程锁的释放在 Go 语言的多线程中会有介绍。 1. defer 的逆序执行 defer 会在函数即将结束的时候执行,而且是按照…
-
Go 语言中的函数
本文来介绍 Go 语言中的函数。Go 语言的函数和其它语言的用法类似,但是 Go 语言中所有东西都是变量,包括函数,函数在 Go 语言中也是变量的一种,所以函数名的命名规则和变量名相同,同时这个和我们后面要讲解的函数式编程有关,目前本文仅介绍 Go 语言中函数的声明和使用。 1. 函数的定义和使用 Go 语言中,通过 func 关键字来声明和定义函数。Go 语言和 C 语言不同,Go 语言函数的声明和定义是一起的,不存在先声明在定义,且声明时不分前后均可互相调用。 代码示例 代码块…
-
Go 语言的通道
Go 语言中有一个特殊的类型 chan,这是在 Go 语言的多线程操作中非常重要的一个数据类型。它的一般用于线程之间的数据传输,所以这个操作类型叫做"通道(channel)"。 1. 通道的声明和定义 通道可以理解为一种特殊的变量,所以它的声明和其它变量的声明并没有太大的区别,声明通道变量的写法如下: var c chan int //声明一个存放int类型数据的通道 代码块 1 但是它声明之后并不能直接使用,需要使用内置函数 make() 来创建一下通道变量才可以使用: Tips…