Go语⾔学习——5、数组array、动态数组slice、字典map ⼀、数组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" ] /*如果确定是真实的,则存在,否则不存在 */
go2map地图北京/*fmt.Println(capital) */
/*fmt.Println(ok) */
if (ok) {
fmt.Println("American 的⾸都是", capital)
} else {
fmt.Println("American 的⾸都不存在")
}
}
运⾏结果:
France ⾸都是巴黎
Italy ⾸都是罗马
Japan ⾸都是东京
India  ⾸都是新德⾥
American 的⾸都不存在

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。