本文介绍了在 Go 语言中如何动态初始化数组大小,并解释了数组和切片的区别。重点讲解了使用 make() 函数创建切片以实现动态大小数组的需求,并提供了示例代码和注意事项,帮助开发者更好地理解和应用切片。同时,也推荐使用 range 循环来更简洁地遍历切片。
在 Go 语言中,数组的大小在声明时必须是固定的常量。这意味着你不能直接使用从用户输入或运行时计算得到的值来定义数组的大小。如果需要在运行时确定数组的大小,你需要使用切片(slice)来代替数组。
数组和切片的区别
- 数组(Array): 具有固定长度,在声明时必须指定长度。数组的长度是其类型的一部分,例如 [3]int 和 [5]int 是不同的类型。
- 切片(Slice): 动态数组,长度可以增长或缩小。切片是对底层数组的一个引用,包含了指向数组的指针、长度和容量。
使用切片实现动态大小数组
要实现动态大小的数组,你需要使用 make() 函数创建一个切片。make() 函数接受两个参数:切片的类型和切片的初始长度。还可以选择性地指定切片的容量。
package main import "fmt" func main() { var elems int sum := 0 fmt.Print("Number of elements? ") fmt.Scan(&elems) // 使用 make() 函数创建切片 slice := make([]int, elems) // 创建一个长度为 elems 的 int 型切片 for i := 0; i < elems; i++ { fmt.printf("%d . Number? ", i+1) fmt.Scan(&slice[i]) sum += slice[i] } mean := float64(sum) / float64(elems) fmt.Printf("Mean: %fn", mean) }
代码解释:
- slice := make([]int, elems):这行代码创建了一个长度为 elems 的 int 型切片。make() 函数会分配一块足够大的内存来存储 elems 个整数,并将切片指向这块内存。
- for i := 0; i
- mean := float64(sum) / float64(elems): 计算平均值。
- fmt.Printf(“Mean: %fn”, mean):输出计算得到的平均值。
更简洁的遍历方式:使用 range
Go 语言提供了 range 关键字,可以更简洁地遍历切片。
package main import "fmt" func main() { var elems int sum := 0 fmt.Print("Number of elements? ") fmt.Scan(&elems) slice := make([]int, elems) for i := range slice { fmt.Printf("%d . Number? ", i+1) fmt.Scan(&slice[i]) sum += slice[i] } mean := float64(sum) / float64(elems) fmt.Printf("Mean: %fn", mean) }
或者,你也可以同时获取索引和值:
package main import "fmt" func main() { var elems int sum := 0 fmt.Print("Number of elements? ") fmt.Scan(&elems) slice := make([]int, elems) for i, _ := range slice { // 使用 _ 忽略值 fmt.Printf("%d . Number? ", i+1) fmt.Scan(&slice[i]) sum += slice[i] } mean := float64(sum) / float64(elems) fmt.Printf("Mean: %fn", mean) }
注意事项:
- 切片的容量是指底层数组可以容纳的元素数量。当切片的长度超过其容量时,Go 语言会自动分配一块更大的内存,并将切片指向新的内存区域。
- 可以使用 append() 函数向切片追加元素。append() 函数会返回一个新的切片,其中包含了追加的元素。
- 理解数组和切片的区别对于编写高效的 Go 代码至关重要。
总结
在 Go 语言中,不能直接使用变量来定义数组的大小。要实现动态大小的数组,你需要使用切片。make() 函数可以用来创建切片,range 关键字可以用来更简洁地遍历切片。 掌握切片的使用是go语言编程的基础。
评论(已关闭)
评论已关闭