Go语言学习教程(七)

一、数组介绍

* 数组:具有固定长度相同类型元素序列

* 声明数组的语法

    //var 对象名 [长度]元素类型

    var arr [5]int

    fmt.Println(arr) //输出:[0 0 0 0 0]

* 数组就是内存中一段固定长度的连续空间.

* 声明数组后数组就会在内存中开辟一块连续空间,每个值称为数组的元素,且元素值为类型对应的默认值.例如int类型默认值为0,string类型默认值为空字符串

* 数组中每个元素按照顺序都有自己整数类型的脚标,脚标从第一个元素为0向后依次加1

* 数组在实际开发中主要作用是充当临时容器,因为声明一个数组变量比声明多个相同类型变量在操作时更加方便

二、数组的创建和赋值

* 声明数组时可以同时给数组赋值,赋值时要求长度必须大于等于初始值个数

    //方式一:完整写法

    var arr [3]int = [3]int{1, 2, 3}

    //方式二:短变量方式

    arr2 := [3]int{1, 2, 3}

    //方式三:长度大于初始值个数.长度为4,只给前三个元素赋值,其余元素为默认值

    arr3 := [4]int{1, 2, 3}

    //方式四:赋值时不写长度,数组长度根据元素个数确定

    arr4 := [...]int{1, 2, 3}

* 可以通过数组名[脚标]对数组中元素进行操作

    arr := [3]int{1, 2, 3}

    fmt.Println(arr)

    //通过脚标对数组中元素进行重新赋值

    arr[0] = 5

    arr[1] = 6

    arr[2] = 7

    fmt.Println(arr[0], arr[1], arr[2])

* 通过len(数组变量)获取数组长度,数组脚标最大值为长度减一,如果超出这个范围将会报错

* 在Go语言中数组是值类型,和int或float64等类型相同,把一个数组变量赋值给另一个数组变量时为复制副本,重新开辟一块空间

* 使用==比较数组中值是否相等

三、多维数组

* 二维数组表示一个数组变量中每个元素又是一个数组变量

* 声明二维数组的语法:var arr [n][m]int

* 声明并创建二维数组

    //写在同一行,最后一个元素后面不需要有逗号

    //arr6:=[3][3]int{{1,2,3},{4,5,6},{7,8,9}}

    arr := [3][3]int{

        {1, 2, 3},

        {4, 5, 6},

        {7, 8, 9}, //每个元素分行写,最后一个必须有逗号

    }

    arr0 := arr[0]

    fmt.Println(arr0[0], arr0[1], arr[2])

    //上面等效于下面的写法.习惯上多写下面的方式

    fmt.Println(arr[0][0], arr[0][1], arr[0][2])

* 理论上支持无限多维数组(只要内存够用)

* 三维数组可以理解成,一维数组中每个元素都是二维数组.四维数组理解成,一个一维数组中每个元素都是三维数组

* 无论是几维数组,都符号元素类型是相同的

* 实际开发中多维数组使用并不多,在一定程度上,程序员使用多维数组很容易出错

四、for循环

* 循环:让程序多次执行相同的代码块

* for循环是Go语言中唯一一个循环结构

* for循环经典语法

    * 先执行表达式1

    * 执行表达式判断是否成立,如果成立执行循环体

    * 循环体执行完成后,执行表达式3

    * 再次执行表达式2,判断是否成立.

for 表达式1;表达式2;表达式3{

  //循环体

}

* for循环用的最多的地方就是遍历数组或切片等

* 经典for循环结构中 , for关键字后面有三个表达式,且每个表达式都可以省略

    for i := 0; i < 5; i++ {

        fmt.Println(i)

    }

    //等价于

    j := 0

    for ; j < 5; {

        fmt.Println(j)

        j++

    }

* for关键字后面也可以只有一个表达式,表示如果条件成立执行循环体代码

    for i := 0; i < 5; i++ {

        fmt.Println(i)

    }

    //等价于

    j := 0

    for j < 5 {

        fmt.Println(j)

        j++

    }

* 可以通过数组的长度判断循环结束条件遍历整个数组

    for i := 0; i < len(arr); i++ {

        fmt.Println(arr[i])

    }

* for循环遍历数组等时常与range结合使用

    * range函数返回两个值,第一个是脚标,第二个是内容

    for i, n := range arr {

        //其中n=arr[i]

        fmt.Println(i, n)

    }

五、双重for循环

* 可以在循环中执行循环,称为双重for循环

    for i := 0; i < 2; i++ {

        for j := 0; j < 2; j++ {

            fmt.Println(i, j)

        }

    }

* 上面代码中注意:

    * 只有当子循环完全执行结束才能再次执行外侧循环.因为循环体执行完才能执行表达式3

六、冒泡排序

* 排序就是把一组数据按照特定的顺序重新排列.可以是升序,降序等

* 冒泡排序利用双重for循环把最大(小)的值移动到一侧,每次可以判断出一个数据,如果有n个数组,执行n-1次循环就可以完成排序

* 排序代码(升序还是降序主要是看if判断是大于还是小于)

    arr := [5]int{1, 7, 3, 6, 2}

    for i := 0; i < len(arr)-1; i++ {

        for j := 0; j < len(arr)-i-1; j++ {

            if arr[j] > arr[j+1] {

                arr[j], arr[j+1] = arr[j+1], arr[j]

            }

        }

    }

    fmt.Println(arr)

七、continue

* continue关键字控制本次循环体结束,执行表达式三

* 在双重for循环中continue默认影响最内侧循环,与最外层循环无关

* Go语言执行标签写法,可以通过定义标签让continue控制影响哪个for循环

    myfor:for k := 0; k < 2; k++ {

        for i := 0; i < 3; i++ {

            if i == 1 {

                continue myfor

            }

            fmt.Println(k, i, "结束")

        }

    }

八、break

* break可以中断for循环,无论for循环还有几次执行,立即停止

* 在双重for循环中,break默认也影响到最近的for循环

* break也可以通过定义标签,控制break对哪个for循环生效

你可能感兴趣的:(Go语言学习教程(七))