一、数组(Array)

1.1 什么是数组

Go 语言提供了数组类型的数据结构。
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。

数组元素可以通过索引(位置)来读取(或者修改),索引从0开始,第一个元素索引为 0,第二个索引为 1,以此类推。数组的下标取值范围是从0开始,到长度减1。

数组一旦定义后,大小不能更改。

1.2 数组的语法

声明和初始化数组

需要指明数组的大小和存储的数据类型。

var variable_name [SIZE] variable_type

示例代码:

var balance [10] float32
var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}

初始化数组中 {} 中的元素个数不能大于 [] 中的数字。
如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:

var balance = []float32{1000.0, 2.0, 3.4, 7.0, 50.0}
balance[4] = 50.0

数组的其他创建方式:

  var a [4] float32 // 等价于:var arr2 = [4]float32{}
  fmt.Println(a) // [0 0 0 0]
  var b = [5] string{"ruby", "王二狗", "rose"}
  fmt.Println(b) // [ruby 王二狗 rose  ]
  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]
  fmt.Println(e)
  f := [...] int{0: 1, 4: 1, 9: 1} // [1 0 0 0 1 0 0 0 0 1]
  fmt.Println(f)

访问数组元素

float32 salary = balance[9]

示例代码:

package main

import "fmt"

func main() {
   var n [10]int /* n 是一个长度为 10 的数组 */
   var i,j int

   /* 为数组 n 初始化元素 */         
   for i = 0; i < 10; i++ {
      n[i] = i + 100 /* 设置元素为 i + 100 */
   }

   /* 输出每个数组元素的值 */
   for j = 0; j < 10; j++ {
      fmt.Printf("Element[%d] = %d\n", j, n[j] )
   }
}

运行结果:

Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109

数组的长度

通过将数组作为参数传递给len函数,可以获得数组的长度。

示例代码:

package main

import "fmt"

func main() {  
    a := [...]float64{67.7, 89.8, 21, 78}
    fmt.Println("length of a is",len(a))

}

运行结果:

length of a is 4

您甚至可以忽略声明中数组的长度并将其替换为…让编译器为你找到长度。这是在下面的程序中完成的。

示例代码:

package main

import (  
    "fmt"
)

func main() {  
    a := [...]int{12, 78, 50} // ... makes the compiler determine the length
    fmt.Println(a)
}

遍历数组:

package main

import "fmt"

func main() {  
    a := [...]float64{67.7, 89.8, 21, 78}
    for i := 0; i < len(a); i++ { //looping from 0 to the length of the array
        fmt.Printf("%d th element of a is %.2f\n", i, a[i])
    }
}

使用range遍历数组:

package main

import "fmt"

func main() {  
    a := [...]float64{67.7, 89.8, 21, 78}
    sum := float64(0)
    for i, v := range a {//range returns both the index and value
        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  
}

1.3 多维数组

Go 语言支持多维数组,以下为常用的多维数组声明语法方式:

var variable_name [SIZE1][SIZE2]...[SIZEN] variable_type
var threedim [5][10][4]int

三维数组

a = [3][4]int{  
 {0, 1, 2, 3} ,   /*  第一行索引为 0 */
 {4, 5, 6, 7} ,   /*  第二行索引为 1 */
 {8, 9, 10, 11}   /*  第三行索引为 2 */
}
int val = a[2][3]

1.4 数组是值类型

数组是值类型
Go中的数组是值类型,而不是引用类型。这意味着当它们被分配给一个新变量时,将把原始数组的副本分配给新变量。如果对新变量进行了更改,则不会在原始数组中反映。

package main

import "fmt"

func main() {  
    a := [...]string{"USA", "China", "India", "Germany", "France"}
    b := a // a copy of a is assigned to b
    b[0] = "Singapore"
    fmt.Println("a is ", a)
    fmt.Println("b is ", b) 
}

运行结果:

a is [USA China India Germany France]  
b is [Singapore China India Germany France] 

数组的大小是类型的一部分。因此[5]int和[25]int是不同的类型。因此,数组不能被调整大小。不要担心这个限制,因为切片的存在是为了解决这个问题。

package main

func main() {  
    a := [3]int{5, 78, 8}
    var b [5]int
    b = a //not possible since [3]int and [5]int are distinct types
}

示例:

package main

import "fmt"

func main() {
    /*
        数据类型:
            基本类型:整数,浮点,布尔,字符串
            复合类型:array,slice,map,struct,pointer,function,channel。。。

        数组:
            1.概念:存储一组相同数据类型的数据结构
                    理解为容器,存储一组数据
            2.语法:
                    var 数组名 [长度] 数据类型
                    var 数组名 = [长度] 数据类型{元素1,元素2.。。}
                    数组名 := [...]数据类型{元素。。。}

            3.通过下标访问
                下标,也叫索引:index,
                默认从0开始的整数,直到长度减1
                数组名[index]
                    赋值
                    取值

                不能越界:[0,长度-1]

            4.长度和容量:go语言的内置函数
                len(array/map/slice/string),长度
                cap(),容量
     */

     var num1 int
     num1 = 100

     num1 = 200
     fmt.Println(num1)
     fmt.Printf("%p\n",&num1)

     //step1:创建数组
     var arr1 [4] int
     fmt.Printf("%p\n",&arr1)
     //step2:数组的访问
     arr1[0] = 1
     arr1[1] = 2
     arr1[2] = 3
     arr1[3] = 4
     fmt.Println(arr1[0])//打印第一个数值
     fmt.Println(arr1[2])//打印第三个数值
     //fmt.Println(arr1[4]) //invalid array index 4 (out of bounds for 4-element array)

     fmt.Println("数组的长度:",len(arr1)) //容器中实际存储的数据量
     fmt.Println("数组的容量:",cap(arr1)) //容器中能够存储的最大的数量
     //因为数组定长,长度和容量相同
     arr1[0] = 100
     fmt.Println(arr1[0])

    //数组的其他创建方式
    var a [4] int //同 var a= [4] int
    fmt.Println(a)

    var b = [4]int{1,2,3,4}
    fmt.Println(b)

    var c = [5]int{1,2,4}
    fmt.Println(c)

    var d = [5]int{1:1,3:2}
    fmt.Println(d)

    var e = [5]string{"rose","王二狗","ruby"}
    fmt.Println(e)

    f := [...]int{1,2,3,4,5}
    fmt.Println(f)
    fmt.Println(len(f))
    g:=[...]int{1:3,6:5}
    fmt.Println(g)
    fmt.Println(len(g))
}

1.5 数组排序

示例:

package main

import "fmt"

func main() {
    // 数组排序
    // 排序算法:插入排序,选择排序,希尔排序,堆排序,快速排序,冒泡排序

    // 冒泡排序:
    /*
        依次比较两个相邻元素,如果他们的顺序(如从大到小)就把他们交换过来
    */
    arr := [...]int{113, 21, 35, 4, 5123, 123, 40934, 8, 43, 128}
    fmt.Println(arr)

    for i := 0; i < len(arr); i++ {
        for j := 0; j < len(arr)-1; j++ {
            if arr[j] > arr[j+1] {
                arr[j], arr[j+1] = arr[j+1], arr[j]
            }
        }
        fmt.Println(arr)
    }
}

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。