【第二十九篇】GO数组的注意事项和细节处理

86 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

一、数组使用注意事项和细节处理:

  1. 数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的,不能动态变化。
package main

import "fmt"

func main() {
	// 数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的,不能动态变化。
	var arr01 [3]int
	arr01[0] = 1
	arr01[1] = 30
	// 这里会报错
	arr01[2] = 1.1

	// 其长度是固定的,这里会报越界
	arr01[3] = 890

	fmt.Println(arr01)
}

因为数组类型是int ,就不能给 1.1

  1. var arr[]int,这时arr就是一个slice切片,切片后面专门讲解。
  2. 数组中的元素可以是任何数据类型,包括值类型和引用类型,但是不能混用。
  3. 数组创建后,如果没有赋值,有默认值
    1. 数值类型数组,默认值为0
    2. 字符串数组,默认值为""
    3. bool 数组,默认值为 false
package main

import "fmt"

func main() {

	var arr01 [3]float32
	var arr02 [3]string
	var arr03 [3]bool

	fmt.Printf("arr01=%v	arr02=%v	arr03=%v\n", arr01, arr02, arr03)
}

  1. 使用数组的步骤
    1. 声明数组并开辟空间。
    2. 给数组各个元素赋值
    3. 使用数组
  1. 数组的下标是从 0开始的。
package main

func main() {
	// 数组的下标是从 0开始的
	var arr04 [3]string
	var index int = 3
	arr04[index] = "tom"
}

  1. 数组下标必须在指定范围内使用,否则报panic,数组越界,比如
    1. var arr[5]int,则有效下标范围为 0-4
  1. Go 数组属值类型,在默认情况下是值传递,因此会进行值拷贝。数组间不会相互影响。
package main

import "fmt"

// 不同数组长度,属于不同的数据类型
func test01(arr [3]int) {
	arr[0] = 88
}
func main() {
	arr := [3]int{11, 22, 33}
	test01(arr)
	fmt.Println("main arr=", arr)
}

  1. 如想在其它函数中,去修改原来的数组,可以使用引用传递(指针方式)
package main

import "fmt"

// 不同数组长度,属于不同的数据类型
func test01(arr [3]int) {
	arr[0] = 88
}

func test02(arr *[3]int) {
	(*arr)[0] = 88
}

func main() {
	arr := [3]int{11, 22, 33}
	fmt.Printf("arr 的地址=%p", &arr)
	test02(&arr)
	fmt.Println("main arr=", arr)
}

  1. 长度是数组类型的一部分,在传递函数参数时需要考虑数组的长度,看下面案例:


二、数组应用案例:

  1. 创建一个byte类型的26个元素的数组,分别放置‘A’-‘Z’。使用for循环访问所以元素并打印出来。提示:字符数据运算‘A’+1 -->‘B’
package main

import "fmt"

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)
	}

	for i := 0; i < 26; i++ {
		fmt.Printf("%c", myChars[i])
	}
}

  1. 请求出一个数组的最大值,并得到对应的下标。
package main

import "fmt"

func main() {
	// 思路:
	// 1. 声明一个数组 var intArr[5]=[....]int{1,-1,9,90,11}
	// 2. 假定第一个元素就是最大值,下标就是0
	// 3. 然后从第二个元素开始循环比较,如果发现有更大的数,则交换

	var intArr [5]int = [...]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", maxVal, maxValIndex)
}

  1. 请求出一个数组的和 ,平均值。for - range
package main

import "fmt"

func main() {
	// 思路:
	// 1. 声明一个数组 var intArr[5]=[....]int{1,-1,9,90,11}
	// 2. 求出和sum
	// 3. 求出平均值

	var intArr2 [5]int = [...]int{1, -1, 9, 90, 12}
	sum := 0

	for _, val := range intArr2 {
		//	累积求和
		sum += val
	}

	// 如何让平均值保留到小数。
	fmt.Printf("sum = %v	平均值 = %v", sum, float64(sum)/float64(len(intArr2)))

}