数组和切片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)))
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号