GOlang是一个强类型语言的特性,所以数组只能放多个同一类型数据的数据类型且长度固定的数据项序列,存放的数据类型可以是任意的原始类型例如整形、字符串或者自定义类型。
假设在开发中我们需要声明10个变量来存放人的名字:
var Name1 = "陈大"
var Name2 = "黄二"
var Name3 = "张三"
var Name4 = "李四"
var Name5 = "王五"
var Name6 = "赵六"
var Name7 = "田七"
var Name8 = "亢八"
var Name9 = "周九"
var Name10 = "吴十"
我们需要定义10次,管理和命名都麻烦,使用数组来处理就会很方便:
var Name [10]string//定义一个数组里面存放10个string类型的值
Name[0] = "陈大"
Name[1] = "黄二"
Name[2] = "张三"
Name[3] = "李四"
Name[4] = "王五"
Name[5] = "赵六"
Name[6] = "田七"
Name[7] = "亢八"
Name[8] = "周九"
Name[9] = "吴十"
//分别把值存入到数组对应的空间内。
数组定义后以后要根据数据类型开辟相应的空间并赋予数据类型的默认值。编号从0开始0,1,2,3以此类推。
我们也可以使用一句话定义数组并赋自定义的初值:
var Name = [10]string{"陈大", "黄二", "张三", "李四", "王五", "赵六", "田七", "亢八", "周九", "吴十"}//达到刚才一样的效果,这样看起来是不是舒服多了。
假设我们开辟了10个空间。自定义初值只定义了2个。剩下的8个数据依然是数据类型的默认值。
var Name = [10]string{"网络人", "www.55mx.com"}
fmt.Println(Name[5])//输出一个空字符”“
如果我们限制了数组大小为2,却输入了3个值。编译的时候就会报错array index 2 out of bounds [0:2]
在不能确定数组长度的时候我们可以使用一个推导的数组[...],可以每次根据定义的数据量自动计算出需要的空间:
var Name = [...]string{"陈大", "黄二", "张三", "李四", "王五", "赵六", "田七", "亢八"}
fmt.Println(len(Name))//计算长度为8
注意:只适用为定义就赋值的时候使用。
var Name[...]string//将报错use of [...] array outside of array literal
总结一下数组定义的几种方式:
var Name [2]string =[2]string {"张三","李四"}//第一种
var Name = [2]string {"张三","李四"}//第二种
var Name = [...]string {"张三","李四"}//第三种
var Name [2]string //第四种先声明再赋值
Name[0] = "张三"
Name[1] = "李四"
//第四种相对于来说繁琐一点,通常我们用于修改数组变量的值才会使用。
//如果使用上面第四种是为了定义数组的索引,我们还可以使用一个可读性更好的方式
var Name =[2]string {1:"张三",0:"李四"}//这里就定义了Name[1] = "张三",Name[0] = "李四"
数组元素可以通过索引(位置、编号)来读取。格式为Name[0](数组名后加中括号,中括号中为索引的值)。例如:
fmt.Println(Name[0])//根据上面对数组的定义 ,将会输出:陈大
这里就能访问到数组里索引为0的数据了,有的时候我们需要取出所有的数据,这时候就需要对数组进行遍历。一般情况可以使用以下两种方法完成:
//通过len统计出数组Name的总数,跑一个for遍历
for i := 0; i < len(Name); i++ {
fmt.Println(Name[i])
}
这种方法在使用上不方便,GO有提供一个类型于PHP中foreach的方式来遍历数组:
var Name =[...]string {"张三","李四"}
for index,value :=range Name {
fmt.Printf("索引值(index):%v ,变量值(value):%v n",index,value)
}
/*
输出结果为:
索引值(index):0 ,变量值(value):张三
索引值(index):1 ,变量值(value):李四
*/
GO语言里定义了的变量就必须要使用,很多时候我们并不会用到index这个索引值 ,我们可以使用”_“来接受并忽略掉不需要的值。
for _,v :=range Name {
fmt.Printf("变量值(value):%v n",v)
}
Go 语言支持多维数组,以下为常用的多维数组声明方式:
var Name = [2][2]string{{"陈大", "男"}, {"黄二", "女"}}
for _, value := range Name {
fmt.Printf("姓名:%v ,姓别:%v n", value[0], value[1])
}
/*
姓名:陈大 ,姓别:男
姓名:黄二 ,姓别:女
*/
多维数组的定义与取值和一维数组一样的,按索引顺序取值就好了。
小提示:var Name = [...][...]string{{"陈大", "男"}, {"黄二", "女"}}红色的3个[...]是错误的哦~array outside of array literal
var number = [3][4]int{
2: {0, 1, 2, 3}, /* 第一行索引为 2 */
0: {4, 5, 6, 7}, /* 第二行索引为 0 */
1: {8, 9, 10, 11}, /* 第三行索引为 1 */
}
同一维数组一下,可以指定索引,如果不指定,就按0,1,2方式排列。
1、在弱类型语言里数组可以自动增长,定义的时候并不需要指向空间大小,而GO语言一但定义了大小,就不会增长,且所有的值的数据类型必须一样。
2、在[]里如果没有写大小或者”...“这是一个切片slice,切片是一个引用类型,不是数组哦~
3、数组里可以存引用类型、值类型,但不能混用,能混用的那个叫结构体struct
4、数组定义后的初始值同变量,可以看http://www.55mx.com/go/70.html这里~
5、数据间是值拷贝,在函数里修改了数组值,并不会影响到外部数组的值参考:http://www.55mx.com/go/71.html。
var LetterChars [2][26]byte //定义一个byte类型的二维数组,每组有26个空间用于存放大小写字母
for i := 0; i < 26; i++ {
LetterChars[0][i] = 'A' + byte(i)
LetterChars[1][i] = 'a' + byte(i)
}
fmt.Println(LetterChars[0]) //输出[65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90]
fmt.Println(LetterChars[1]) //输出[97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122]
for _, value := range LetterChars {
for _, pvalue := range value {
fmt.Printf("%c", pvalue) //将会输出 ABCDEFGHIJKLMNOPQRSTUVWXYZ 和 abcdefghijklmnopqrstuvwxyz
}
fmt.Println()
}
除非注明,网络人的文章均为原创,转载请以链接形式标明本文地址:https://www.55mx.com/post/73
《GO语言学习笔记4:数组详解》的网友评论(0)