Golang的高级数据类型-数组(array)实战篇

          Golang的高级数据类型-数组(array)实战篇

                             作者:尹正杰

版权声明:原创作品,谢绝转载!否则将追究法律责任。

 

  

  数组(array)是指一组相同类型的数据在内存中有序存储的集合。数组的长度只能是常量,也就是说数组一旦定义后就无法对这个数组进行扩容。

 

 

一.数组的基本使用

1>.数组的定义和初始化赋值

package main

import "fmt"

func main() {
    /*
        什么是数组:
            数组是指一组相同类型的数据在内存中有序存储的集合。数组的长度只能是常量,也就是说数组一旦定义后就无法对这个数组进行扩容。

        数组的定义格式:
            语法一(声明数组):
                var 数组名称 [元素个数]数组类型

            语法二(数组初始化):
                var 数组名称 [元素个数]数组类型 = [元素个数]数组类型{元素1,元素2,...元素N}

            语法三(自动推导类型初始化):
                数组名称 := [元素个数]数组类型{}
    */

    /*
        如下所示,数组定义也是通过var关键词,后面是数组的名称arr1,数组的长度是10,数组类型是整型。
        当定义数组后,就在内存中开辟了10个连续的存储空间,每个数据都存储在相应的空间内,数组中包含的每个数据被称为数组元素(element),一个数组包含的元素个数被称为数组的长度。
    */
    var arr1 [10]int

    fmt.Printf("arr1数组未赋值前的默认值为:%d
", arr1)
    /*
        数组定义完成后,可以对数组进行赋值操作。
        数组是通过下标来进行操作的,下标的范围是从0开始到数组长度减1的位置,使用数组下标来赋值时需要注意以下几项:
            (1)如果数组下标小于0或大于数组长度减1,则会出现索引越界异常;
            (2)如果数组定义为负值,则根据不同类型的数据进行初始化;

        常见数组类型的默认值:
            整型默认初始化值为0;
            浮点型默认初始化值为0;
            字符串类型默认初始化值为空串("");
            布尔类型默认初始化值为false;
    */
    arr1[1] = 100
    arr1[3] = 200
    arr1[5] = 300
    fmt.Printf("arr1数组经过赋值后的数据为:%d
", arr1)

    /*
        数组初始化:
            在定义数组时也可以完成赋值,这种情况叫做数组的初始化。
    */
    var arr3 [5]int = [5]int{1, 3, 5, 7, 9} //全部初始化

    var arr5 [7]int = [7]int{2, 4, 6, 8, 10} //初始化部分数据,未初始化值为默认值

    arr7 := [3]int32{'', '', ''} //自动推导类型初始化

    arr9 := [9]rune{3: '', 4: '', 5: ''} //指定元素初始化,未初始化值使用默认值

    fmt.Printf("arr3数组经过初始化赋值后的数据为:%d
", arr3)
    fmt.Printf("arr5数组经过初始化赋值后的数据为:%d
", arr5)
    fmt.Printf("arr7数组经过初始化赋值后的数据为:%d
", arr7)
    fmt.Printf("arr9数组经过初始化赋值后的数据为:%d
", arr9)

}

2>.数组作为函数参数(本质上是值传递)

package main

import (
    "fmt"
)

/*
    形参和实参操作的数组不是同一个地址中的数据,所以修改被调函数中的元素的值并不会影响主函数中实参数组元素的值。
*/
func modify(arr [5]int) {

    arr[2] = 100 //修改数组元素的值

    fmt.Println("in modify: ", arr) //被掉函数中,数组元素被修改

    fmt.Printf("被调函数中形参数组的地址:%p
", &arr) //打印被调函数的的参数地址:
}

func main() {
    arr := [5]int{9, 5, 2, 7, 1}

    modify(arr) //将数组作为函数参数,其实是值传递,形参不能改变实参的值

    fmt.Println("主函数: ", arr) //主函数中数组元素并未被修改

    fmt.Printf("主调函数中形参数组的地址:%p
", &arr) //打印主函数的的参数地址:
}

二.数组的遍历

1>.基于数组索引下标进行遍历

package main

import (
    "fmt"
)

func main() {

    var arr [5]int = [5]int{100, 80, 300, 500, 1024}

    /*
        基于数组的索引下标进行遍历
    */
    for index := 0; index < len(arr); index++ {
        fmt.Printf("arr数组索引下标[%d]保存的值是: [%d]
", index, arr[index])
    }

}

2>.基于range关键字进行遍历

package main

import (
    "fmt"
)

func main() {

    var arr [5]int = [5]int{100, 80, 300, 500, 1024}

    /*
        通过range关键字遍历数组,可以同时得到数组的索引下标和改下表对应的数据,
        通过range实现范围遍历,这一点和Python中的enumerate方法有着异曲同工之妙。
    */
    for index, value := range arr {
        fmt.Printf("arr数组索引下标[%d]保存的值是: [%d]
", index, value)
    }
}

三.数组使用案例

1>.整型数组求最值,总数及平均数

package main

import (
    "fmt"
)

func main() {

    /*
        从一个整型数种取出最大的整数,最小的整数,数组个元素的总和及平均值
    */
    var arr [5]int = [5]int{100, 80, 300, 500, 1024}

    var (
        max   = arr[0]
        min   = arr[0]
        total = 0
    )

    for index := 1; index < len(arr); index++ {
        //取最大值
        if arr[index] > max {
            max = arr[index]
        }
        //取最小值
        if arr[index] < min {
            min = arr[index]
        }
        //求和
        total += arr[index]
    }

    //求平均数
    average := total / len(arr)

    fmt.Printf("数组中最大值为:[%d]
数组中最小值为:[%d]
数组中总和为:[%d]
数组中的平均数为:[%d]
", max, min, total, average)
}

2>.将一个数组的元素顺序进行反转-回文诗

package main

import (
    "fmt"
)

func main() {
    var arr []rune = []rune{'', '', '', '', '', '', ''}

    fmt.Printf("为发生交换之前,arr的数据为:[%s]
", string(arr)) //使用string进行强制类型转换,打印中文

    //最小值索引下标
    minIndex := 0

    //最大值下标
    maxIndex := len(arr) - 1

    for minIndex < maxIndex {

        //使用多重赋值,交换两个遍历的值
        arr[minIndex], arr[maxIndex] = arr[maxIndex], arr[minIndex]

        minIndex++ //将最小索引下标加上1

        maxIndex-- //将最大索引下标减去1
    }

    fmt.Printf("发生交换之后,arr的数据为:[%s]
", string(arr))
}
package main

import (
    "fmt"
)

func main() {

    var arr []rune = []rune{'', '', '', '', '', '', ''}

    for index := 0; index <= len(arr)-1; index++ {
        fmt.Print(string(arr[index]))
    }

    fmt.Println()

    for index := len(arr) - 1; index >= 0; index-- {
        fmt.Print(string(arr[index]))
    }
}
倒着遍历数组也可以实现回文诗的要求,且效率较高,因为没有发生数据交换。

3>.使用数组的方式实现冒泡排序

  博主推荐阅读:
    https://www.cnblogs.com/yinzhengjie2020/p/12219968.html
原文地址:https://www.cnblogs.com/yinzhengjie2020/p/12328138.html