美文网首页一个程序猿的奋斗史php开发
Go语言学习笔记11.复合类型-数组

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

作者: 快乐的提千万 | 来源:发表于2019-11-06 09:15 被阅读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]
    }
    
    

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

    相关文章

      网友评论

        本文标题:Go语言学习笔记11.复合类型-数组

        本文链接:https://www.haomeiwen.com/subject/crkebctx.html