持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情
一、数组使用注意事项和细节处理:
- 数组是多个相同类型数据的组合,一个数组一旦声明/定义了,其长度是固定的,不能动态变化。
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
var arr[]int,这时arr就是一个slice切片,切片后面专门讲解。- 数组中的元素可以是任何数据类型,包括值类型和引用类型,但是不能混用。
- 数组创建后,如果没有赋值,有默认值
-
- 数值类型数组,默认值为
0 - 字符串数组,默认值为
"" - 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)
}
- 使用数组的步骤
-
- 声明数组并开辟空间。
- 给数组各个元素赋值
- 使用数组
- 数组的下标是从
0开始的。
package main
func main() {
// 数组的下标是从 0开始的
var arr04 [3]string
var index int = 3
arr04[index] = "tom"
}
- 数组下标必须在指定范围内使用,否则报
panic,数组越界,比如
-
var arr[5]int,则有效下标范围为 0-4
- 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)
}
- 如想在其它函数中,去修改原来的数组,可以使用引用传递(指针方式)
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)
}
- 长度是数组类型的一部分,在传递函数参数时需要考虑数组的长度,看下面案例:
二、数组应用案例:
- 创建一个
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])
}
}
- 请求出一个数组的最大值,并得到对应的下标。
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)
}
- 请求出一个数组的和 ,平均值。
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)))
}