一、数组介绍
* 数组:具有固定长度相同类型元素序列
* 声明数组的语法
//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循环生效