
本文介绍了在 Go 语言中如何动态地创建一个大小在编译时未知的数组(实际上是切片)。我们将使用 make 函数来分配内存,并提供示例代码帮助你理解如何在实际项目中使用它。
在 Go 语言中,直接创建大小在编译时未知的数组是不允许的。但是,我们可以使用切片(slice)来达到类似的效果。切片是对底层数组的一个抽象,它提供了动态调整大小的能力。make 函数是创建切片的关键。
使用 make 函数创建切片
make 函数用于创建切片、映射(map)和通道(channel)。对于切片,make 函数接受两个或三个参数:
- 类型: 切片元素的类型(例如 int、string 等)。
- 长度: 切片的初始长度,即切片中元素的个数。
- 容量 (可选): 切片底层数组的容量,即切片可以容纳的最大元素个数。如果省略容量,则容量等于长度。
make 函数会分配一个底层数组,并返回一个指向该数组的切片。
示例代码
以下代码演示了如何使用 make 函数创建一个大小为 size 的 int 类型切片:
基于jsp+javabean+mysql三层结构的动态购物网站。网站用户接口(即界面)由jsp完成,数据和逻辑处理由beans完成,数据储存由mysql完成。因为beans独立负责处理整个网站的绝大部分数据,所以整个网站的负载量和速度都将大大提高。而且jsp的特性是一次运行,永远储留内存(包括bean在内),所以基于这种语言和结构开发的购物系统的优势是其它语言没法比尔的。更重要的是,jsp+bea
package main
import "fmt"
func MakeSlice(size int) []int {
slice := make([]int, size) // 创建一个长度和容量都为 size 的 int 切片
return slice
}
func main() {
size := 10
mySlice := MakeSlice(size)
// 初始化切片
for i := 0; i < len(mySlice); i++ {
mySlice[i] = i * 2
}
// 打印切片的内容
fmt.Println(mySlice) // 输出: [0 2 4 6 8 10 12 14 16 18]
// 打印切片的长度和容量
fmt.Printf("Length: %d, Capacity: %d\n", len(mySlice), cap(mySlice)) // 输出: Length: 10, Capacity: 10
}代码解释
- MakeSlice 函数接受一个整数 size 作为参数,表示切片的大小。
- make([]int, size) 创建一个类型为 []int 的切片,其长度和容量都为 size。
- return slice 返回创建的切片。
- 在 main 函数中,我们调用 MakeSlice 函数创建一个大小为 10 的切片,并将其赋值给 mySlice 变量。
- 我们使用 for 循环初始化切片的元素。
- fmt.Println(mySlice) 打印切片的内容。
- fmt.Printf("Length: %d, Capacity: %d\n", len(mySlice), cap(mySlice)) 打印切片的长度和容量。
指定容量
在某些情况下,你可能需要创建一个长度小于容量的切片。这允许你在不重新分配内存的情况下向切片添加元素。
package main
import "fmt"
func MakeSliceWithCapacity(size int, capacity int) []int {
slice := make([]int, size, capacity) // 创建一个长度为 size,容量为 capacity 的 int 切片
return slice
}
func main() {
size := 5
capacity := 10
mySlice := MakeSliceWithCapacity(size, capacity)
// 初始化切片
for i := 0; i < len(mySlice); i++ {
mySlice[i] = i
}
// 打印切片的内容
fmt.Println(mySlice) // 输出: [0 1 2 3 4]
// 打印切片的长度和容量
fmt.Printf("Length: %d, Capacity: %d\n", len(mySlice), cap(mySlice)) // 输出: Length: 5, Capacity: 10
// 使用 append 函数向切片添加元素
mySlice = append(mySlice, 5, 6, 7, 8, 9)
// 打印切片的内容
fmt.Println(mySlice) // 输出: [0 1 2 3 4 5 6 7 8 9]
// 打印切片的长度和容量
fmt.Printf("Length: %d, Capacity: %d\n", len(mySlice), cap(mySlice)) // 输出: Length: 10, Capacity: 10
}注意事项
- 切片是引用类型,这意味着多个切片可以指向同一个底层数组。修改一个切片会影响到其他指向同一个数组的切片。
- 当切片的长度超过容量时,Go 会自动重新分配一个新的底层数组,并将原数组的内容复制到新数组中。这会带来一定的性能开销,因此在创建切片时,最好预估切片的最大长度,并将其设置为容量。
- 使用 append 函数向切片添加元素时,如果切片的容量不足,append 函数会自动重新分配一个新的底层数组。
总结
在 Go 语言中,使用 make 函数可以方便地创建动态大小的切片。通过指定长度和容量,你可以灵活地控制切片的内存分配。理解切片的长度和容量以及 append 函数的行为对于编写高效的 Go 代码至关重要。 切片是Go语言中处理动态数组的首选方式,掌握其使用是Go编程的基础。








