数组和切片2
数组的遍历:
方式1-常规遍历:
前面已经讲过了,不在赘述。
方式2-for-range结构遍历
这是Go语言一种独有的结构,可以用来遍历访问数组的元素
基本语法:
for inde, value := range array01 {
...
}
说明:
1)第一个返回值 index 是数组的下标
2)第二个value是在该下标位置的值
3)它们都是仅在 for 循环内部可见的局部变量
4)遍历数组元素的时候,如果不想使用下标index,可以直接把下标index标为下划线_
5)index 和 value 的名称不是固定的,即程序员可以自行指定,一般命名为 index 和 value
案例:
func main() {
//演示for-range遍历数组
var heroes = [3]string{"松江", "吴用", "卢俊义"}
for i, v := range heroes {
fmt.Printf("i=%v v=%v\n", i, v)
fmt.Printf("heroes[%d]=%v\n", i, heroes[i]) //传送方式打印,建议使用上面的
}
for _, v := range heroes {
fmt.Printf("元素的值=%v\n", v)
}
}
数组的注意事项和细节:
1)数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的,不能动态变化。
func main() {
var arr01 [3]int
arr01[0] = 1
arr01[1] = 30
//arr01[2] = 1.1 //这里会报错,数据类型不统一
arr01[2] = 90
//其长度是固定的,不能动态变化,否则报越界
//arr01[3] = 80 数组不能动态增长
fmt.Println(arr01)
}
2)var arr []int 这时 arr 就是一个slice 切片,切片后面专门讲解。
3)数组中的元素可以是任何数据类型,包括值类型和引用类型,但是不能混用。
4)数组创建后,如果没有赋值,有默认值(零值)
数值类型数组:默认值为0
字符串数组: 默认值为 ""
bool数组: 默认值为 false
func main() {
//1.数值(整数系列,浮点数系列) => 0
//2.字符串 ==> ""
//3.布尔类型 ==> false
var arr01 [3]float32
var arr02 [3]string
var arr03 [3]bool
fmt.Printf("arr01=%v arr02=%v arr03=%v\n", arr01, arr02, arr03)
}
5)使用数组的步骤 1. 声明数组并开辟空间 2.给数组各个元素赋值 3.使用数组
6)数组的下标是从0开始的。
7)数组下标必须在指定范围内使用,否则报 panic:数组越界,比如: var arr [5]int 则有效下标为 0-4
8)Go的数组属 值类型, 在默认情况下是值传递,因此会进行值拷贝。数组间不会相互影响。
func test01(arr [3]int) {
arr[0] = 88
}
func main() {
arr := [3]int{11, 22, 33}
test01(arr)
fmt.Println("main arr=", arr)
}
9)如想在其他函数中,去修改原来的数组,可以使用引用传递(指针方式)
func test02(arr *[3]int) {
(*arr)[0] = 88
}
func main() {
arr := [3]int{11, 22, 33}
test02(&arr)
fmt.Println("main arr=", arr)
}
10)长度是数组类型的一部分,在传递函数参数时,需要考虑数组的长度,看下面的例子:
题1:
编译错误,因为不能把[3]int 传递给 []int
题2:
编译错误,因为不能把[3]int 传递给[4]int ,go语言认为这是两种数据类型。所以不匹配。
题3:
这个正确
数组的应用案例:
1)创建一个byte类型的26个元素的数组,分别 放置'A'-'Z'。使用for循环访问所有元素并打印出来。提示:字符数据运算 'A'+1 -> 'B'
func main() {
//思路
//1.声明一个数组 var myChars [26]byte
//2.使用for循环,利用 字符可以进行运算的特点来赋值 'A'+1 -> 'B'
//3.使用for打印即可
var myChars [26]byte
for i := 0; i < 26; i++ {
myChars[i] = 'A' + byte(i) //注意需要将 i=>byte
fmt.Printf("%c ", myChars[i])
}
}
2)请求出一个数组的最大值,并得到对应的下标
func main() {
//思路
//1.声明一个数组 var intArr[5] = [...]int {1, -1, 9, 90, 11}
//2.嘉定第一个元素就是最大值,下标就0
//3.然后从第二个元素开始循环比较,如果发现有更大,则交换
var intArr = [...]int {1, -1, 9, 90, 11}
maxVal := intArr[0]
maxValIndex := 0
for i := 1; i < len(intArr); i++ {
if maxVal < intArr[i] {
maxVal = intArr[i]
maxValIndex = i
}
}
fmt.Printf("maxVal=%v maxValIndex=%v \n", maxVal, maxValIndex)
}
3)请求出一个数组的和和平均值。 for-range
func main() {
//思路
//1.声明一个数组
//2.求出和sum
//3.求出平均值
var intArr2 = [...]int {1, -1, 9, 90, 12}
sum := 0
for _, val := range intArr2 {
//累计求和
sum += val
}
fmt.Printf("sum=%v 平均值=%v\n", sum, float64(sum) / float64(len(intArr2)))
}