一、数组array
1.1、定义方式:
var arr [n] type
其中,n为长度,type为类型。具体使用如下:
var arr [10] int //声明一个 int 类型的数组
arr[0] = 42 //赋值操作
arr[1] = 13 //赋值操作
fmt.Printf("the first element is %d\n", arr[0]) //下标获取值,返回42
fmt.Printf("the last element is %d\n", arr[9]) //最后一个元素未赋值,默认返回0
1.2、简约方式声明【:=】
a := [3] int {1,2,3} // 声明了一个长度为3的int数组
b :=[10] int {1,2,3} //声明一个长度为10的数组,前三个元素被初始化为1、2、3,其余部分默认为0
c :=[...] int {4,5,6} //省略长度采用‘...’的方式,Go语言会自动根据元素个数来计算长度
1.3、多维数组
Go语言支持嵌套数组,即多维数组。如下代码声明了一个二维数组:
//声明一个二维数组,该数组以两个数组作为元素,其中每个数组又有4个int类型的元素
doubleArray := [2][4] int {[4] int {1,2,3,4}, [4] int {5,6,7,8}}
//简化上述声明,直接忽略内部类型
easyArray := [2][4] int {{1,2,3,4},{5,6,7,8}}
数组的分配如图:
图 多维数组的映射关系
二、切片slice(“动态数组”)
如果初始定义数组时,不知道数组的长度,就需要“动态数组”,在Go语言中这种结构叫 slice。
注意:slice并非真正意义上的数组,它只是一个引用类型,指向一个底层数组array。
2.1、声明与定义
2.1.1 直接初始化
//和array一样,只是少了长度
var fslice []int
初始化数据
fslice := []byte {'a','b','c','d'}
2.1.2 基于数组或已有slice初始化
slice可以从一个数组或已经存在的slice中再次声明。slice通过 array[i:j] 来获取,其中 i 是数组的开始位置,j 是结束位置,但不包含arr[j],它的长度是 j-i。
//声明一个包含10个元素,且元素类型为type的数组
var ar =[10]{'a','b','c','d','e','f','g','h','i','j'}
//声明两个含有byte类型元素的slice
var a,b []byte
//a指向数组的第三个到第五个元素:ar[2]、ar[3]、ar[4]
a = ar[3:5]
//b指向数组的第四和第五个元素:ar[3]、ar[4]
b = ar[4:5]
声明数组时,方括号内必须要有具体的长度或者使用…来自动计算长度。而声明slice时,方括号内没有任何字符。
2.2、一些简便操作
slice默认开始位置是0,结束位置为数组的长度,如:
var ar =[10]{'a','b','c','d','e','f','g','h','i','j'}
var aslice
aslice = ar[:] //等价于 aslice = arr[0:10]
从slice中获取slice:
var bslice
bslice = aslice[5:] //等价于 bslice = aslice[5:10]
注:slice是引用类型,所以当引用改变其中元素值时,其他的所有引用都会改变该值。
即,ar改变会影响aslice,aslice改变会影响bslice
2.3、深入理解slice
我个人感觉,它和vector有相似之处。vector是三个指针:
- start
- finish
- end_of_storage
从概念上,slice像一个结构体,包含了三个元素: - 指针,指向起始位置
- 长度,即slice的长度
- 最大长度,即slice开始位置到数组(被引用的数组)的最后位置的长度
三、Map
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
3.1、定义 Map
可以使用内建函数 make 也可以使用 map 关键字来定义 Map:
/* 声明变量,默认 map 是 nil(零值) */
var map_variable map[key_data_type]value_data_type
/* 使用 make 函数 */
map_variable := make(map[key_data_type]value_data_type)
如果不初始化 map,那么就会创建一个 nil map(空map)。nil map 不能用来存放键值对。
3.2、创建和使用map
package main
import "fmt"
func main() {
var countryCapitalMap map[string]string /*创建集合 */
countryCapitalMap = make(map[string]string)
/* map插入key - value对,各个国家对应的首都 */
countryCapitalMap [ "France" ] = "巴黎"
countryCapitalMap [ "Italy" ] = "罗马"
countryCapitalMap [ "Japan" ] = "东京"
countryCapitalMap [ "India " ] = "新德里"
/*使用键输出地图值 */
for country := range countryCapitalMap {
fmt.Println(country, "首都是", countryCapitalMap [country])
}
/*查看元素在集合中是否存在 */
capital, ok := countryCapitalMap [ "American" ] /*如果确定是真实的,则存在,否则不存在 */
/*fmt.Println(capital) */
/*fmt.Println(ok) */
if (ok) {
fmt.Println("American 的首都是", capital)
} else {
fmt.Println("American 的首都不存在")
}
}
运行结果:
France 首都是 巴黎
Italy 首都是 罗马
Japan 首都是 东京
India 首都是 新德里
American 的首都不存在