数组和切片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)))
}

 

posted @ 2019-08-14 23:32  我是一只忙碌的小青蛙  阅读(169)  评论(0编辑  收藏  举报