跟我一起来学golang之《数组》

223 阅读3分钟

数组

数组概念

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。从概念上讲所有语言种的数组基本都是一样的。注意数组一旦定义后,大小不能更改。

相关语法

  • 声明和初始化数组
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 //无法赋值
}