数组
数组概念
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。从概念上讲所有语言种的数组基本都是一样的。注意数组一旦定义后,大小不能更改。
相关语法
- 声明和初始化数组
var variable_name [size] variable_type
示例
var tmp [20] int
var tmp1 = [5]{1,2,3,4,5}
说明:初始化数组中 {} 中的元素个数不能大于 [] 中的数字。 如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:
var tmp2 = []int{1,2,3,4,5,6}
len(tmp2) //输出结果为6
如果需要对数组元素中的值进行修改:
tmp2[1] = 100
fmt.Println(tmp2) //[100 2 3 4 5 6]
- 数组的其它创建方式
var a [4] float32 // 等价于:var arr2 = [4]float32{}
fmt.Println(a) // [0 0 0 0]
var c = [5] int{'A', 'B', 'C', 'D', 'E'} // byte
fmt.Println(c) // [65 66 67 68 69]
d := [...] int{1,2,3,4,5}// 根据元素的个数,设置数组的大小
fmt.Println(d)//[1 2 3 4 5]
e := [5] int{4: 100} // [0 0 0 0 100] 含义为下标为4的位置存储值为100
fmt.Println(e)
f := [...] int{0: 1, 4: 1, 9: 1} // [1 0 0 0 1 0 0 0 0 1]
fmt.Println(f)
- 数组的元素访问方式
int tn = tmp2[2] //表示访问获取tmp2数组下标为2的元素
var t [20] int
var t1 ,t2 int
for t1=0;t1<10;t1++ {
t[t1] = t1*2
}
for t2 = 0;t2<10 ;t2++ {
fmt.Printf("第【%d】个,值是 %d\n",t2,t[t2])
}
代码运行结果
第【0】个,值是 0
第【1】个,值是 2
第【2】个,值是 4
第【3】个,值是 6
第【4】个,值是 8
第【5】个,值是 10
第【6】个,值是 12
第【7】个,值是 14
第【8】个,值是 16
第【9】个,值是 18
- 获取数组的长度
函数为:len(arr)
lens := len(t)
fmt.Println("长度:",lens)
如果声明数组的时候定义长度为…那么编译器会计算出对应数组的长度
a1 := [...]int{12, 78, 50}
fmt.Println(len(a1))
- 获取数组的容量
函数为:cap(arr)
caps := cap(t)
fmt.Println("容量:",caps)
- 遍历数组
上面代码已经举过例子通过for循环进行遍历数组。遍历数组还有其它方法,使用range函数进行遍历。
a := [...]float64{67.7, 89.8, 21, 78}
sum := float64(0)
for i, v := range a {//range returns both the index and val
fmt.Printf("%d the element of a is %.2f\n", i, v)
sum += v
}
fmt.Println("\nsum of all elements of a",sum)
如果您只需要值并希望忽略索引,那么可以通过使用_ blank标识符替换索引来即可。
for _, v := range a {
//ignores index
}
二维数组
Go 语言支持多维数组,以下为常用的多维数组声明语法方式:
var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
a = [3][4]int{
{0, 1, 2, 3} , /* 第一行索引为 0 */
{4, 5, 6, 7} , /* 第二行索引为 1 */
{8, 9, 10, 11} /* 第三行索引为 2 */
}
多维数组平时使用的可能比较少,大家了解即可。
数组的特点
数组是值类型,Go中的数组是值类型,而不是引用类型。这意味着当它们被分配给一个新变量时,将把原始数组的副本分配给新变量。如果对新变量进行了更改,则不会在原始数组中反映。
func main() {
a := [...]string{"1", "2", "3", "4", "5"}
b := a // 把a赋值给b
b[0] = "100"
fmt.Println("a is ", a)
fmt.Println("b is ", b)
}
运行结果:
a is [1 2 3 4 5]
b is [100 2 3 4 5]
数组的大小是类型的一部分。因此[50]int和[25]int是不同的类型。因此,数组不能被调整大小。不要担心这个限制,因为切片的存在是为了解决这个问题。
package main
func main() {
a := [3]int{5, 78, 8}
var b [5]int
b = a //无法赋值
}