一个程序猿的奋斗史php开发

Go语言学习笔记11.复合类型-数组

2019-11-06  本文已影响0人  快乐的提千万

数组

作为后端开发语言,可能数组用的是最多的了。
数组是指一系列同一类型数据的集合。数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。
数组⻓度必须是常量,且是类型的组成部分。 [2]int 和 [3]int 是不同类型。
定义:

var b [10]int
v:= [10] int
//注意:定义数组时,指定的数组元素个数必须是常量
//n := 10
//var c [n]int //err non-constant array bound n

通过下标访问:len()获取数组的长度

id :=  [50]int
//操作数组,通过下标, 从0开始,到len()-1
for i := 0; i < len(id); i++ {
    id[i] = i + 1
    fmt.Printf("id[%d] = %d\n", i, id[i])
}

初始化,没有初始化的就是0

//全部初始化或部分初始化
id :=  [50]int{1,2,3,4,5}  //前面5个赋值,后面全是0
//指定某个元素初始化
d := [5]int{2: 10, 4: 20} //d =  [0 0 10 0 20]
b := [...]int{1, 2, 3}    // 通过初始化值确定数组长度

多维数组

package main //必须有个main包

import "fmt"

func main() {
    //有多少个[]就是多少维
    //有多少个[]就用多少个循环
    var a [3][4]int

    k := 0
    for i := 0; i < 3; i++ {
        for j := 0; j < 4; j++ {
            k++
            a[i][j] = k
            fmt.Printf("a[%d][%d] = %d, ", i, j, a[i][j])
        }
        fmt.Printf("\n")
    }
    /*
        a[0][0] = 1, a[0][1] = 2, a[0][2] = 3, a[0][3] = 4,
        a[1][0] = 5, a[1][1] = 6, a[1][2] = 7, a[1][3] = 8,
        a[2][0] = 9, a[2][1] = 10, a[2][2] = 11, a[2][3] = 12,
    */

    fmt.Println("a = ", a)//a =  [[1 2 3 4] [5 6 7 8] [9 10 11 12]]

    //多维数组初始化
    //有3个元素,每个元素又是一维数组[4]int
    b := [3][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}}
    fmt.Println("b = ", b)

    //部分初始化,没有初始化的值为0
    c := [3][4]int{{1, 2, 3}, {5, 6, 7, 8}, {9, 10}}
    fmt.Println("c = ", c)//c =  [[1 2 3 0] [5 6 7 8] [9 10 0 0]]

    d := [3][4]int{{1, 2, 3, 4}, {5, 6, 7, 8}}
    fmt.Println("d = ", d)//d =  [[1 2 3 4] [5 6 7 8] [0 0 0 0]]

    e := [3][4]int{1: {5, 6, 7, 8}} 
    fmt.Println("e = ", e)//e =  [[0 0 0 0] [5 6 7 8] [0 0 0 0]]
}

数组遍历

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

//迭代器遍历
//第一个返回下标,第二个返回元素
for i, data := range a {
    fmt.Printf("a[%d] = %d\n", i, data)
}

数组的比较和赋值

package main //必须有个main包

import "fmt"

func main() {
    //支持比较,只支持 == 或 !=, 比较是不是每一个元素都一样,2个数组比较,数组类型要一样
    a := [5]int{1, 2, 3, 4, 5}
    b := [5]int{1, 2, 3, 4, 5}
    c := [5]int{1, 2, 3}
    fmt.Println(" a == b ", a == b) //a == b  true
    fmt.Println(" a == c ", a == c) //a == c  false

    //同类型的数组可以赋值
    var d [5]int
    d = a
    fmt.Println("d = ", d)
}

数组做参数

package main

import "fmt"

func main() {
   /* 数组长度为 5 */
   var  balance = [5]int {1000, 2, 3, 17, 50}
   var avg float32

   /* 数组作为参数传递给函数 */
   avg = getAverage( balance, 5 ) ;

   /* 输出返回的平均值 */
   fmt.Printf( "平均值为: %f ", avg );
}
func getAverage(arr [5]int, size int) float32 {
   var i,sum int
   var avg float32  

   for i = 0; i < size;i++ {
      sum += arr[i]
   }

   avg = float32(sum) / float32(size)

   return avg;
}

数组指针

一个int需要8套别墅,8个int需要64套别墅,一样的道理,只需要告诉别人首地址,然后后面64套都是我的,别人怎么知道64?因为通过类型和长度可以推导出来。

package main //必须有个main包

import "fmt"

func modify(p *[5]int) {
    (*p)[0] = 666
    fmt.Println("modify *a = ", *p) //modify *a =  [666 2 3 4 5]
}

func main() {
    a := [5]int{1, 2, 3, 4, 5} //初始化

    modify(&a) //地址传递
    fmt.Println("main: a = ", a) //main: a =  [666 2 3 4 5]
}

这里数组指针做函数参数就很明显可以看出来,是传引用(地址传递),而数组做参数是值传递。

上一篇下一篇

猜你喜欢

热点阅读