go语言的数组、切片和映射

一、go语言数组

1、数组的定义

数组是一组具有相同类型的数据集合,每个成员称为数组元素.这个与java,c中的数组是一样的.

数组的定义形式:

  1. var arrName [n]varType
  • arrName 表示数组的变量名
  • n表示数组的长度(即数组元素的个数)
  • varType表示数组元素的数据类型
  • [n]varType是一个整体,表示数组的类型(如[5]int表示有5个元素的整型数组)
  • 数组元素长度一旦声明,后面是不能修改数组的长度(即无法动态增加数组元素,如果需要,可以使用切片slice)
  1. var titles []string
2、数组的初始化
(1)先声明再初始化
  1. var titles [5]string
  2. titles = [5]string{"JAVA工程师", "PHP工程师", "OpenResty工程程师", "GoLang工程师", "WEB架构师"}
(2)声明并初始化
  1. var languages = [...]string{"JAVA", "PHP", "OpenResty", "GoLang", "Node.js"}
  2. //var languages = [5]string{"JAVA", "PHP", "OpenResty", "GoLang", "Node.js"}

注:

  • 当数组在声明并同时初始化时,因为数组元素个数已经确定,所以可以使用…来代替元素个数的声明,系统在编译时会自动计算
  • 当数组在声明并同时初始化,可以省略数组元素数据类型的声明,因为初始化时会指定元素的数据类型
3、数组元素访问
  • 通过数组下标(数组索引)可以访问数组的元素值,但数组下标值(数组索引)值不能
  • 可以通过for range来遍历数组
  • 可以通过len函数获取数组的长度
  1. var languages = [...]string{"JAVA", "PHP", "OpenResty", "GoLang", "Node.js"}
  2. for i, v := range languages {
  3. fmt.Printf("i = %d, v = %s, languages[%d] = %s\n", i, v, i, languages[i])
  4. }

以上代码输出以下内容:

  1. i = 0, v = JAVA, languages[0] = JAVA
  2. i = 1, v = PHP, languages[1] = PHP
  3. i = 2, v = OpenResty, languages[2] = OpenResty
  4. i = 3, v = GoLang, languages[3] = GoLang
  5. i = 4, v = Node.js, languages[4] = Node.js

二、go语言切片slice

1、切片的定义

可以认为切片slice是一个动态数组,可以动态增加元素.它的底层其实是一个数组,它是一个指向底层数组(存储数据元素)的指针.它的定义与数组基本一致,只是不用指定元素个数(即切片长度)

  1. var cityList []string
2、切片的初始化
(1)先声明后初始化
  1. var visitCityList []string
  2. visitCityList = []string{"北京", "上海", "深圳", "杭州", "武汉", "济南", "淄博", "南京", "张家港", "舟山", "菏泽", "商丘", "十堰", "安康"}
(2)声明的同时并初始化
  1. var viewpoint = []string{"西湖", "西溪湿地", "千岛湖", "富春江", "天目山"}
(3)通过make初始化
  1. var steps = make([]string, 5, 10)
  • make是一个用于初始化的函数,它不仅可以用于slice,还可以用于map,channel等
  • make函数在用于slice时,第一个参数表示切片的数据类型,如这里的[]string
  • make函数的第二个参数len表示切片的长度
  • make函数的第三个参数capicity表示切片的容量,也表示其底层数据的长度
(4)通过数组切割或切片切割初始化
  1. var cityList = [...]string{"北京", "上海", "深圳", "广州", "成都", "杭州", "武汉"}
  2. var superCityList = cityList[0:4]
  • cityList[0:4]表示新的切片是从原数组或切片中切割出一部分元素作为新切片的元素.
  • [0:4]表示索引值为0-4的元素即[0,4)集合,即0,1,2,3这3个元素

关于切片的长度和容量:

  • 假如原数组arr或切片长度为n,容量为n
  • 那么切片arr[i:j]的长度为j-i,容量为n-i
  1. var cityList = [...]string{"北京", "上海", "深圳", "广州", "成都", "杭州", "武汉"}
  2. var superCityList = cityList[0:4]
  3. //输出为:len:4, capicity:7
  4. fmt.Printf("len:%d, capicity:%d\n", len(superCityList), cap(superCityList))
  5. var level2 = cityList[4:6]
  6. //输出为:len:2, capicity:3
  7. fmt.Printf("len:%d, capicity:%d\n", len(level2), cap(level2))
(5)与切片相关的函数
  • len 可以获取切片的长度(也可以用于数组和映射)
  • cap 可以获取切片的容量大小
  1. var cityList = [...]string{"北京", "上海", "深圳", "广州", "成都", "杭州", "武汉"}
  2. var superCityList = cityList[0:4]
  3. fmt.Printf("len:%d, capicity:%d\n", len(superCityList), cap(superCityList))

以上代码输出:

  1. len:4, capicity:7
(6)切片是指向数组的指针

修改切片的值,会修改指向的数组的值

  1. var cityList = [...]string{"北京", "上海", "深圳", "广州", "成都", "杭州", "武汉"}
  2. var level2 = cityList[4:6]
  3. level2[1] = "南京"
  4. fmt.Println(cityList)

输出:

  1. 北京 上海 深圳 广州 成都 南京 武汉

注:切片所指向的数组原来所在位置的”杭州”变成了”南京”

三、go语言映射map

1、go的映射map的含义
  • go语言中的map是一个以键值对的形式出现的数据结构,与其他语言中的,如java中的map,python的dict,php中的关联数组是类似的.
2、go的映射map的定义声明

声明形式:

  1. var mapVarName map[keyType]valueType
  • mapVarName表示映射的变量名
  • keyType表示映射的键的数据类型
  • valueType表示映射的值的数据类型

如:

  1. var config map[string]string
3、go的映射map的初始化
(1)先声明后初始化
  1. var config map[string]string
  2. config = map[string]string{"siteName":"诗心客博客", "domain":"shixinke.com", "since":"2013", "server":"OpenResty"}
(2)声明并初始化
  1. var categoryList = map[string]string{"php":"PHP开发", "java":"JAVA开发"}
(3)通过make初始化
  1. var subDomain = make(map[string]string, 5)
4、go的映射map元素的访问

通过映射的键名来访问映射的值

  1. var categoryList = map[string]string{"php":"PHP开发", "java":"JAVA开发"}
  2. fmt.Println(categoryList["php"])
5、go的映射map相关的函数
  • len:可以获取映射的长度
  • make:可以初始化映射
  • range:与for配合可以遍历映射