数组Array

* 本页面主要介绍Go语言聚合数据类型数组Array的相关内容。

如果你有过其他编程语言基础的话,那么数组对你来讲绝对不会陌生,它是编程领域中最最常见的数据结构之一。

顾名思义,数组就是指一系列同一类型数据的集合。数组中的每一个元素我们称之为数组元素(element),一个数组包含的元素个数成为数组长度(length)。数组长度可以是0个或多于0个,但是一旦确定下来,这个长度就是固定不变的。数组长度是数组类型的一个组成部分。是在编译阶段就确定下来的,所以可以是常量或常量表达式。因此,在实际应用中,很少用到数组(更多的是切片)。

在Go语言中,数组是一个值类型(value type),而不是指向数组内存起始位置的指针。 值类型在赋值和作为参数传递时都将产生一次复制动作。对数组参数的任何的修改都是发生在复制的数组上,并不能直接修改调用时原始的数组变量。这一点跟C语言中的处理方式大不相同。当然,也可以显示地传入一个数组指针(*[n]T)来达成期望的效果。但依旧不建议使用数组来实现这种场景。

下面的代码示例中展示了数组的声明、获取数组元素以及长度、循环遍历数组等常见操作。

  var a [3]int             // array of 3 integers
  fmt.Println(a[0])        // print the first element
  fmt.Println(a[len(a)-1]) // print the last element, a[2]

  // Print the indices and elements.
  for i, v := range a {
      fmt.Printf("%d %d\n", i, v)
  }

  // Print the elements only.
  for _, v := range a {
      fmt.Printf("%d\n", v)
  }

  // For 循环
  for i := 0; i < len(c); i++ {
      fmt.Printf("c[%d]: %d\n", i, c[i])
  }

遍历方法中,用for range方式的性能可能会更好一些,因为这种迭代可以保证不会出现数组越界的情形,每轮迭代对数组元素的访问时可以省去对下标越界的判断。

如果下标在数组合法范围之外(0~len(s)-1),则触发访问越界的panic

  # command-line-arguments
  .\main.go:27:16: invalid array index 3 (out of bounds for 2-element array)

数组默认情况下会被初始化为元素类型对应的零值。也可以使用数组字面值语法来初始化数组:

  var q [3]int = [3]int{1, 2, 3}
  var r [3]int = [3]int{1, 2}
  fmt.Println(r[2]) // "0"
  q := [...]int{1, 2, 3}
  fmt.Printf("%T\n", q) // "[3]int"
  r := [...]int{99: -1} //长度100,最后一个元素-1

如果在数组的长度位置出现的是“...”省略号,则表示数组的长度是根据初始化值的个数来计算

数组可以用 “==” 或 “!=” 进行判等操作,且只有两个数组中的每一个元素都相等时,结果才为true。

  a := [2]int{1, 2}
  b := [...]int{1, 2}
  c := [2]int{1, 3}
  fmt.Println(a == b, a == c, b == c) // "true false false"
  d := [3]int{1, 2}
  fmt.Println(a == d) // compile error: cannot compare [2]int == [3]int

以上就是数组的全部内容,你学的怎么样?


* 本页内容参考以下数据源:

  • 《Go程序设计语言》
  • https://studygolang.com/articles/1177
  • https://www.cnblogs.com/-wenli/p/11071198.html

凯冰科技 · 代码改变世界,技术改变生活
Next Page→