之前我们初探了Go语言世界,了解到基本数据类型,为了满足不同的特殊需求,我们便要使用到以不同的方式组合基本类型构造出来了新的复合型数据类型——数组、结构体、slice、map。
数组是由一个或多个相同类型的元素组成的固定长度的序列。
例如:
一维数组:
//声明一个数组
var arr[4]int
//声明并初始化数组
var brr = [3]int{1,2,3}
二维数组:
//声明一个二维数组
var a[3][3]int
//声明并初始化二维数组
var b = [5][5]int{{1,2,3,4,5}}
内置的len函数可以返回数组中元素的个数:
var a = [3]int{1,2}
fmt.Println(len(a)-1) //输出a[2]的值0
数组的每个元素可以通过索引下标来访问,索引下标的范围是从0开始到数组长度减1的位置。
因为数组的长度是固定的,因此在Go语言中很少直接使用数组,和数组对应的类型是Slice (切片),它是变长的序列无固定长度,可以增长和收缩动态序列,用途更广泛。
slice是变长序列,所以可以声明一个未指定大小的数组定义切片
var 数组名字 []type
或者使用make定义:
var slice1 []type = make([]type, len)
//也可以简写为
slice1 := make([]type, len)
切片除了长度还有一个容量(capacity)的概念,可以在声明slice的时候同时指定长度和容量
s := make([]string,3,10)
通过 s1 := arr[startIndex:endIndex] 可以创造新切片s1 ,且arr可以为数组,其余操作貌似和python的切片类似,不过go的切片更像一个变长数组或者说链表。
Go支持append()函数用于向切片中追加值,支持copy()函数用于复制切片。
切片是可索引的,并且可以由 len() 方法获取长度。
切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。
哈希表是一种巧妙并且实用的数据结构。它是一个无序的key-value对的集合﹐其中所有的key都是不同的﹐然后通过给定的key可以在常数时间复杂度内检索﹑更新或删除对应的value。
在获取 Map 的值时,如果键不存在,返回该类型的零值,例如 int 类型的零值是 0,string 类型的零值是 " "。
Map 是引用类型,如果将一个 Map 传递给一个函数或赋值给另一个变量,它们都指向同一个底层数据结构,因此对 Map 的修改会影响到所有引用它的变量。
可以使用内置函数 make 或使用 map 关键字来定义 Map:
/* 使用 make 函数 */
map_variable := make(map[KeyType]ValueType, initialCapacity)
其中 KeyType 是键的类型,ValueType 是值的类型,initialCapacity 是可选的参数,用于指定 Map 的初始容量。Map 的容量是指 Map 中可以保存的键值对的数量,当 Map 中的键值对数量达到容量时,Map 会自动扩容。如果不指定 initialCapacity,Go 语言会根据实际情况选择一个合适的值。
// 创建一个初始容量为 10 的 Map
m := make(map[string]int, 10)
// 使用字面量创建 Map
m := map[string]int{
"student": 1,
"teacher": 2,
"school": 3,
}
// 获取键值对
v1 := m["student"]
v2, result := m["pen"] // 如果键不存在,result 的值为 false,v2 的值为该类型的零值
// 修改键值对
m["student"] = 5
// 遍历 Map
for k, v := range m {
fmt.Printf("key=%s, value=%d\n", k, v)
}
// 删除键值对
delete(m, "teacher")
Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。 用结构体的经典案例处理公司的员工信息﹐每个员工信息包含一个唯一的员工编号﹑员工的名字﹑家庭住址﹑出生日期﹑工作岗位﹑薪资﹑上级领导等等。所有的这些信息都需要绑定到一个实体中﹐可以作为一个整体单元被复制﹐作为函数的参数或返回值﹐或者是被存储到数组中﹐等等。
结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。结构体声明语法如下:
type StructName struct{
FieldName type
}
一旦定义了结构体类型,它就能用于变量的声明,语法格式如下:
variable_name := structure_variable_type {value1, value2...valuen}
或
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}